From: Willy Tarreau Date: Sat, 20 Nov 2021 19:10:41 +0000 (+0100) Subject: BUG/MEDIUM: cli: make sure we can report a warning from a bind keyword X-Git-Tag: v2.5.0~5 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0a1e1cb55549833700a79a8ffb0e85bbbd110f90;p=thirdparty%2Fhaproxy.git BUG/MEDIUM: cli: make sure we can report a warning from a bind keyword Since recent 2.5 commit c8cac04bd ("MEDIUM: listener: deprecate "process" in favor of "thread" on bind lines"), the "process" bind keyword may report a warning. However some parts like the "stats socket" parser will call such bind keywords and do not expect to face warnings, so this will instantly cause a fatal error to be reported. A concrete effect is that "stats socket ... process 1" will hard-fail indicating the keyword is deprecated and will be removed in 2.7. We must relax this test, but the code isn't designed to report warnings, it uses a single string and only supports reporting an error code (-1). This patch makes a special case of the ERR_WARN code and uses ha_warning() to report it, and keeps the rest of the existing error code for other non-warning codes. Now "process" on the "stats socket" is properly reported as a warning. No backport is needed. --- diff --git a/src/cli.c b/src/cli.c index 3b068031fb..2ea5aacbbe 100644 --- a/src/cli.c +++ b/src/cli.c @@ -441,6 +441,7 @@ static int cli_parse_global(char **args, int section_type, struct proxy *curpx, while (*args[cur_arg]) { struct bind_kw *kw; const char *best; + int code; kw = bind_find_kw(args[cur_arg]); if (kw) { @@ -450,7 +451,19 @@ static int cli_parse_global(char **args, int section_type, struct proxy *curpx, return -1; } - if (kw->parse(args, cur_arg, global.cli_fe, bind_conf, err) != 0) { + code = kw->parse(args, cur_arg, global.cli_fe, bind_conf, err); + + /* FIXME: this is ugly, we don't have a way to collect warnings, + * yet some important bind keywords may report warnings that we + * must display. + */ + if (((code & (ERR_WARN|ERR_FATAL|ERR_ALERT)) == ERR_WARN) && err && *err) { + indent_msg(err, 2); + ha_warning("parsing [%s:%d] : '%s %s' : %s\n", file, line, args[0], args[1], *err); + ha_free(err); + } + + if (code & ~ERR_WARN) { if (err && *err) memprintf(err, "'%s %s' : '%s'", args[0], args[1], *err); else