]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: acl: Only allow one '-m' matching method
authorChristopher Faulet <cfaulet@haproxy.com>
Fri, 29 Aug 2025 15:43:07 +0000 (17:43 +0200)
committerChristopher Faulet <cfaulet@haproxy.com>
Mon, 1 Sep 2025 13:45:05 +0000 (15:45 +0200)
Several '-m' explicit matching method was allowed, but only the last one was
really used. There is no reason to specify several matching method and it is
most probably an error or a lack of understanding of how matchings are
performed. So now, an error is triggered during the configuration parsing to
avoid any bad usage.

src/acl.c

index fe2310ef5d342b54de224023b3c90230f89dc039..57fcaa5a7e02ec25e1abebca9790f2be874bc19b 100644 (file)
--- a/src/acl.c
+++ b/src/acl.c
@@ -149,7 +149,7 @@ struct acl_expr *parse_acl_expr(const char **args, char **err, struct arg_list *
        signed long long value, minor;
        /* The following buffer contain two numbers, a ':' separator and the final \0. */
        char buffer[NB_LLMAX_STR + 1 + NB_LLMAX_STR + 1];
-       int is_loaded;
+       int is_loaded, match_forced;
        int unique_id;
        char *error;
        struct pat_ref *ref;
@@ -321,6 +321,7 @@ struct acl_expr *parse_acl_expr(const char **args, char **err, struct arg_list *
        refflags = PAT_REF_ACL;
        patflags = 0;
        is_loaded = 0;
+       match_forced = 0;
        unique_id = -1;
        while (**args == '-') {
                if (strcmp(*args, "-i") == 0)
@@ -360,6 +361,10 @@ struct acl_expr *parse_acl_expr(const char **args, char **err, struct arg_list *
                                memprintf(err, "'-m' must only be specified before patterns and files in parsing ACL expression");
                                goto out_free_expr;
                        }
+                       if (match_forced) {
+                               memprintf(err, "only one explicit matching method can be defined with '*m' parameter");
+                               goto out_free_expr;
+                       }
 
                        idx = pat_find_match_name(args[1]);
                        if (idx < 0) {
@@ -377,6 +382,7 @@ struct acl_expr *parse_acl_expr(const char **args, char **err, struct arg_list *
                        expr->pat.match = pat_match_fcts[idx];
                        expr->pat.prune = pat_prune_fcts[idx];
                        expr->pat.expect_type = pat_match_types[idx];
+                       match_forced = 1;
                        args++;
                }
                else if (strcmp(*args, "-M") == 0) {