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 9c93db9..5b99296 100644
--- a/include/proto/pattern.h
+++ b/include/proto/pattern.h
@@ -209,7 +209,7 @@
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 9b67a61..8417c1b 100644
--- a/src/acl.c
+++ b/src/acl.c
@@ -536,13 +536,10 @@
}
/* 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 2059309..a8b56ca 100644
--- a/src/pattern.c
+++ b/src/pattern.c
@@ -2065,7 +2065,7 @@
* flag <reuse> 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 @@
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 @@
/* 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 @@
*/
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