From: Emeric Brun Date: Mon, 3 Jul 2017 15:54:23 +0000 (+0200) Subject: BUG/MEDIUM: map/acl: fix unwanted flags inheritance. X-Git-Tag: v1.8-dev3~254 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7d27f3c12d2aaa3514cdd02ed94ce4421c32fd6d;p=thirdparty%2Fhaproxy.git BUG/MEDIUM: map/acl: fix unwanted flags inheritance. The bug: Maps/ACLs using the same file/id can mistakenly inherit their flags from the last declared one. i.e. $ cat haproxy.conf listen mylistener mode http bind 0.0.0.0:8080 acl myacl1 url -i -f mine.acl acl myacl2 url -f mine.acl acl myacl3 url -i -f mine.acl redirect location / if myacl2 $ cat mine.acl foobar Shows an unexpected redirect for request 'GET /FOObAR HTTP/1.0\n\n'. This fix should be backported on mainline branches v1.6 and v1.7. --- diff --git a/include/proto/pattern.h b/include/proto/pattern.h index 9c93db93d2..5b99296144 100644 --- a/include/proto/pattern.h +++ b/include/proto/pattern.h @@ -209,7 +209,7 @@ int pattern_read_from_file(struct pattern_head *head, unsigned int refflags, con void pattern_init_expr(struct pattern_expr *expr); struct pattern_expr *pattern_lookup_expr(struct pattern_head *head, struct pat_ref *ref); struct pattern_expr *pattern_new_expr(struct pattern_head *head, struct pat_ref *ref, - char **err, int *reuse); + int patflags, char **err, int *reuse); struct sample_data **pattern_find_smp(struct pattern_expr *expr, struct pat_ref_elt *elt); int pattern_delete(struct pattern_expr *expr, struct pat_ref_elt *ref); diff --git a/src/acl.c b/src/acl.c index 9b67a611b0..8417c1b5d9 100644 --- a/src/acl.c +++ b/src/acl.c @@ -536,13 +536,10 @@ struct acl_expr *parse_acl_expr(const char **args, char **err, struct arg_list * } /* Create new pattern expression associated to this reference. */ - pattern_expr = pattern_new_expr(&expr->pat, ref, err, NULL); + pattern_expr = pattern_new_expr(&expr->pat, ref, patflags, err, NULL); if (!pattern_expr) goto out_free_expr; - /* Copy the pattern matching and indexing flags. */ - pattern_expr->mflags = patflags; - /* now parse all patterns */ while (**args) { arg = *args; diff --git a/src/pattern.c b/src/pattern.c index 20593093e8..a8b56ca5e3 100644 --- a/src/pattern.c +++ b/src/pattern.c @@ -2065,7 +2065,7 @@ struct pattern_expr *pattern_lookup_expr(struct pattern_head *head, struct pat_r * flag is set. */ struct pattern_expr *pattern_new_expr(struct pattern_head *head, struct pat_ref *ref, - char **err, int *reuse) + int patflags, char **err, int *reuse) { struct pattern_expr *expr; struct pattern_expr_list *list; @@ -2088,7 +2088,8 @@ struct pattern_expr *pattern_new_expr(struct pattern_head *head, struct pat_ref list_for_each_entry(expr, &ref->pat, list) if (expr->pat_head->index == head->index && expr->pat_head->parse == head->parse && - expr->pat_head->parse_smp == head->parse_smp) + expr->pat_head->parse_smp == head->parse_smp && + expr->mflags == patflags) break; if (&expr->list == &ref->pat) expr = NULL; @@ -2109,6 +2110,9 @@ struct pattern_expr *pattern_new_expr(struct pattern_head *head, struct pat_ref /* Initialize this new expr. */ pattern_init_expr(expr); + /* Copy the pattern matching and indexing flags. */ + expr->mflags = patflags; + /* This new pattern expression reference one of his heads. */ expr->pat_head = head; @@ -2377,10 +2381,9 @@ int pattern_read_from_file(struct pattern_head *head, unsigned int refflags, */ expr = pattern_lookup_expr(head, ref); if (!expr || (expr->mflags != patflags)) { - expr = pattern_new_expr(head, ref, err, &reuse); + expr = pattern_new_expr(head, ref, patflags, err, &reuse); if (!expr) return 0; - expr->mflags = patflags; } /* The returned expression may be not empty, because the function