]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MEDIUM: thread/http: Add missing locks in set-map and add-acl HTTP rules
authorChristopher Faulet <cfaulet@haproxy.com>
Fri, 19 Apr 2019 12:50:55 +0000 (14:50 +0200)
committerChristopher Faulet <cfaulet@haproxy.com>
Fri, 19 Apr 2019 13:53:23 +0000 (15:53 +0200)
Locks are missing in the rules "http-request set-map" and "http-response
add-acl" when an acl or map update is performed. Pattern elements must be
locked.

This patch must be backported to 1.9 and 1.8. For the 1.8, the HTX part must be
ignored.

src/proto_http.c
src/proto_htx.c

index e68b0e2f5224fff73a281eee13373d6f252bfe04..695ff7e33bf2a2493478cf51a2ee3ac347c6a04b 100644 (file)
@@ -1750,12 +1750,14 @@ resume_execution:
                        value->area[value->data] = '\0';
 
                        /* perform update */
+                       HA_SPIN_LOCK(PATREF_LOCK, &ref->lock);
                        if (pat_ref_find_elt(ref, key->area) != NULL)
                                /* update entry if it exists */
                                pat_ref_set(ref, key->area, value->area, NULL);
                        else
                                /* insert a new entry */
                                pat_ref_add(ref, key->area, value->area, NULL);
+                       HA_SPIN_UNLOCK(PATREF_LOCK, &ref->lock);
 
                        free_trash_chunk(key);
                        free_trash_chunk(value);
@@ -2058,8 +2060,10 @@ resume_execution:
 
                        /* perform update */
                        /* check if the entry already exists */
+                       HA_SPIN_LOCK(PATREF_LOCK, &ref->lock);
                        if (pat_ref_find_elt(ref, key->area) == NULL)
                                pat_ref_add(ref, key->area, NULL, NULL);
+                       HA_SPIN_UNLOCK(PATREF_LOCK, &ref->lock);
 
                        free_trash_chunk(key);
                        break;
index 5643c625a42b083f097376697943ff165fefa713..d2c03e180beabd0afb7fded9a2b3ed174374d995 100644 (file)
@@ -2977,13 +2977,14 @@ static enum rule_result htx_req_get_intercept_rule(struct proxy *px, struct list
                                value->area[value->data] = '\0';
 
                                /* perform update */
+                               HA_SPIN_LOCK(PATREF_LOCK, &ref->lock);
                                if (pat_ref_find_elt(ref, key->area) != NULL)
                                        /* update entry if it exists */
                                        pat_ref_set(ref, key->area, value->area, NULL);
                                else
                                        /* insert a new entry */
                                        pat_ref_add(ref, key->area, value->area, NULL);
-
+                               HA_SPIN_UNLOCK(PATREF_LOCK, &ref->lock);
                                free_trash_chunk(key);
                                free_trash_chunk(value);
                                break;
@@ -3272,9 +3273,10 @@ resume_execution:
 
                                /* perform update */
                                /* check if the entry already exists */
+                               HA_SPIN_LOCK(PATREF_LOCK, &ref->lock);
                                if (pat_ref_find_elt(ref, key->area) == NULL)
                                        pat_ref_add(ref, key->area, NULL, NULL);
-
+                               HA_SPIN_UNLOCK(PATREF_LOCK, &ref->lock);
                                free_trash_chunk(key);
                                break;
                        }