BUG/MINOR: tcpcheck: Don't use arg list for default proxies during parsing
During tcp/http check rules parsing, when a sample fetch or a log-format
string is parsed, the proxy's argument list used to track unresolved
argument is no longer passed for default proxies. It means it is no longer
possible to rely on sample fetches depending on the execution context (for
instance 'nbsrv').
It is important to avoid HAProxy crashes because these arguments are
resolved during the configuration validity check. But, default proxies are
not evaluated during this stage. Thus, these arguments remain unresolved.
It will probably be possible to relax this rule. But to ease backports, it
is forbidden for now.
This patch must be backported as far as 2.2. It depends on the commit
"MINOR: arg: Be able to forbid unresolved args when building an argument
list". It must be adapted for the 2.3 because PR_CAP_DEF capability was
introduced in the 2.4. A solution may be to test The proxy's id agains NULL.
(cherry picked from commit eaba25dd97e95a45ba1fa1e9ce41c951410621c0)
Signed-off-by: Christopher Faulet <cfaulet@haproxy.com>
diff --git a/src/log.c b/src/log.c
index 7dabe16..b3651cf 100644
--- a/src/log.c
+++ b/src/log.c
@@ -480,7 +480,8 @@
cmd[1] = "";
cmd_arg = 0;
- expr = sample_parse_expr(cmd, &cmd_arg, curpx->conf.args.file, curpx->conf.args.line, err, &curpx->conf.args, endptr);
+ expr = sample_parse_expr(cmd, &cmd_arg, curpx->conf.args.file, curpx->conf.args.line, err,
+ (curpx->cap & PR_CAP_DEF) ? NULL: &curpx->conf.args, endptr);
if (!expr) {
memprintf(err, "failed to parse sample expression <%s> : %s", text, *err);
goto error_free;
diff --git a/src/tcpcheck.c b/src/tcpcheck.c
index 1c20f5e..ecc3b88 100644
--- a/src/tcpcheck.c
+++ b/src/tcpcheck.c
@@ -2432,7 +2432,7 @@
px->conf.args.ctx = ARGC_SRV;
port_expr = sample_parse_expr((char *[]){args[cur_arg], NULL}, &idx,
- file, line, errmsg, &px->conf.args, NULL);
+ file, line, errmsg, (px->cap & PR_CAP_DEF) ? NULL: &px->conf.args, NULL);
if (!port_expr) {
memprintf(errmsg, "error detected while parsing port expression : %s", *errmsg);
@@ -3234,7 +3234,7 @@
release_sample_expr(status_expr);
px->conf.args.ctx = ARGC_SRV;
status_expr = sample_parse_expr((char *[]){args[cur_arg], NULL}, &idx,
- file, line, errmsg, &px->conf.args, NULL);
+ file, line, errmsg, (px->cap & PR_CAP_DEF) ? NULL: &px->conf.args, NULL);
if (!status_expr) {
memprintf(errmsg, "error detected while parsing status-code expression : %s", *errmsg);
goto error;
diff --git a/src/vars.c b/src/vars.c
index 9be146e..130e98b 100644
--- a/src/vars.c
+++ b/src/vars.c
@@ -815,7 +815,7 @@
}
rule->arg.vars.expr = sample_parse_expr((char **)args, arg, px->conf.args.file,
- px->conf.args.line, err, &px->conf.args, NULL);
+ px->conf.args.line, err, (px->cap & PR_CAP_DEF) ? NULL: &px->conf.args, NULL);
if (!rule->arg.vars.expr)
return ACT_RET_PRS_ERR;