]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MEDIUM: cli: always reset the service context between commands
authorWilly Tarreau <w@1wt.eu>
Thu, 18 Aug 2022 16:04:37 +0000 (18:04 +0200)
committerWilly Tarreau <w@1wt.eu>
Thu, 18 Aug 2022 16:16:36 +0000 (18:16 +0200)
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".

src/cli.c

index c2ca84de133f7b5c386e5833de0f10721cca320f..320bab4c7dc24091a7ecd0a46098ecc8b50c1b4f 100644 (file)
--- 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);