]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MINOR: stick-table: fix the sc-set-gpt* parser when using expressions
authorWilly Tarreau <w@1wt.eu>
Tue, 24 Aug 2021 12:57:28 +0000 (14:57 +0200)
committerWilly Tarreau <w@1wt.eu>
Tue, 24 Aug 2021 13:05:48 +0000 (15:05 +0200)
The sc-set-gpt0() parser was extended in 2.1 by commit 0d7712dff ("MINOR:
stick-table: allow sc-set-gpt0 to set value from an expression") to support
sample expressions in addition to plain integers. However there is a
subtlety there, which is that while the arg position must be incremented
when parsing an integer, it must not be touched when calling an expression
since the expression parser already does it.

The effect is that rules making use of sc-set-gpt0() followed by an
expression always ignore one word after that expression, and will typically
fail to parse if followed by an "if" as the parser will restart after the
"if". With no condition it's different because an empty condition doesn't
result in trying to parse anything.

This patch moves the increment at the right place and adds a few
explanations for a code part that was far from being obvious.

This should be backported to branches having the commit above (2.1+).

src/stick_table.c

index e50ef2571e92812030501d969e2ca9d244b29613..6f07080f64a97253ba271fb17ad5e9a5d85f8e62 100644 (file)
@@ -2633,9 +2633,13 @@ static enum act_parse_ret parse_set_gpt(const char **args, int *arg, struct prox
                return ACT_RET_PRS_ERR;
        }
 
+       /* value may be either an integer or an expression */
        rule->arg.gpt.expr = NULL;
        rule->arg.gpt.value = strtol(args[*arg], &error, 10);
-       if (*error != '\0') {
+       if (*error == '\0') {
+               /* valid integer, skip it */
+               (*arg)++;
+       } else {
                rule->arg.gpt.expr = sample_parse_expr((char **)args, arg, px->conf.args.file,
                                                       px->conf.args.line, err, &px->conf.args, NULL);
                if (!rule->arg.gpt.expr)
@@ -2658,7 +2662,6 @@ static enum act_parse_ret parse_set_gpt(const char **args, int *arg, struct prox
                        return ACT_RET_PRS_ERR;
                }
        }
-       (*arg)++;
 
        rule->action = ACT_CUSTOM;