From: Willy Tarreau Date: Thu, 18 Aug 2022 16:04:37 +0000 (+0200) Subject: BUG/MEDIUM: cli: always reset the service context between commands X-Git-Tag: v2.7-dev4~16 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1addf8b777c69b905591634e492893a2a9233d50;p=thirdparty%2Fhaproxy.git 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". --- diff --git a/src/cli.c b/src/cli.c index c2ca84de13..320bab4c7d 100644 --- a/src/cli.c +++ b/src/cli.c @@ -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,8 +1107,10 @@ 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. */ @@ -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);