From: William Lallemand Date: Fri, 25 Oct 2019 19:10:14 +0000 (+0200) Subject: BUG/MINOR: cli: don't call the kw->io_release if kw->parse failed X-Git-Tag: v2.1-dev4~37 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=90b098c;p=thirdparty%2Fhaproxy.git BUG/MINOR: cli: don't call the kw->io_release if kw->parse failed The io_release() callback of the cli_kw is supposed to be used to clean what an io_handler() has made. It is called once the work in the IO handler is finished, or when the connection was aborted by the client. This patch fixes a bug where the io_release callback was called even when the parse() callback failed. Which means that the io_release() could called even if the io_handler() was not called. Should be backported in every versions that have a cli_kw->release(). (as far as 1.7) --- diff --git a/src/cli.c b/src/cli.c index 6037e9698b..db695d5fd3 100644 --- a/src/cli.c +++ b/src/cli.c @@ -577,10 +577,19 @@ static int cli_parse_request(struct appctx *appctx) appctx->io_handler = kw->io_handler; appctx->io_release = kw->io_release; - /* kw->parse could set its own io_handler or ip_release handler */ - if ((!kw->parse || kw->parse(args, payload, appctx, kw->private) == 0) && appctx->io_handler) { - appctx->st0 = CLI_ST_CALLBACK; - } + + if (kw->parse && kw->parse(args, payload, appctx, kw->private) != 0) + goto fail; + + /* kw->parse could set its own io_handler or io_release handler */ + if (!appctx->io_handler) + goto fail; + + appctx->st0 = CLI_ST_CALLBACK; + return 1; +fail: + appctx->io_handler = NULL; + appctx->io_release = NULL; return 1; }