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