BUG/MEDIUM: cli: always reset the service context between commands

Erwan Le Goas reported that chaining certain commands on the CLI would
systematically crash the process; for example, "show version; show sess".
This happened since the conversion of cli context to appctx->svcctx,
because if applet_reserve_svcctx() is called a first time for a tiny
context, it's allocated in-situ, and later a keyword that wants a
larger one will see that it's not null and will reuse it and will
overwrite the end of the first one's context.

What is missing is a reset of the svcctx when looping back to
CLI_ST_GETREQ.

This needs to be backported to 2.6, and relies on previous commit
"MINOR: applet: add a function to reset the svcctx of an applet".
This commit is contained in:
Willy Tarreau 2022-08-18 18:04:37 +02:00
parent 1cc08a33e1
commit 1addf8b777

View File

@ -896,6 +896,7 @@ static void cli_io_handler(struct appctx *appctx)
if (appctx->st0 == CLI_ST_INIT) {
/* reset severity to default at init */
appctx->cli_severity_output = bind_conf->severity_output;
applet_reset_svcctx(appctx);
appctx->st0 = CLI_ST_GETREQ;
appctx->cli_level = bind_conf->level;
}
@ -1106,9 +1107,11 @@ static void cli_io_handler(struct appctx *appctx)
prompt = "\n";
}
if (applet_putstr(appctx, prompt) != -1)
if (applet_putstr(appctx, prompt) != -1) {
applet_reset_svcctx(appctx);
appctx->st0 = CLI_ST_GETREQ;
}
}
/* If the output functions are still there, it means they require more room. */
if (appctx->st0 >= CLI_ST_OUTPUT) {
@ -1128,6 +1131,7 @@ static void cli_io_handler(struct appctx *appctx)
}
/* switch state back to GETREQ to read next requests */
applet_reset_svcctx(appctx);
appctx->st0 = CLI_ST_GETREQ;
applet_will_consume(appctx);