]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
Revert "BUG/MEDIUM: pattern: fix possible infinite loops on deletion"
authorWilly Tarreau <w@1wt.eu>
Tue, 16 Sep 2025 14:27:21 +0000 (16:27 +0200)
committerWilly Tarreau <w@1wt.eu>
Tue, 16 Sep 2025 14:32:39 +0000 (16:32 +0200)
This reverts commit 359a829ccb8693e0b29808acc0fa7975735c0353.
The fix is neither sufficient nor correct (it triggers ASAN). Better
redo it cleanly rather than accumulate invalid fixes.

src/pattern.c

index c740dbe8abc012523c4bd2ddca6a8cc45f4c674e..9971841394c46e843aacdf2a67aec86713af94a2 100644 (file)
@@ -1626,16 +1626,18 @@ int pat_ref_delete_by_id(struct pat_ref *ref, struct pat_ref_elt *refelt)
  */
 int pat_ref_gen_delete(struct pat_ref *ref, unsigned int gen_id, const char *key)
 {
-       struct pat_ref_elt *elt;
+       struct pat_ref_elt *elt, *next;
        int found = 0;
 
        /* delete pattern from reference */
-       for (elt = cebs_item_lookup(&ref->ceb_root, node, pattern, key, struct pat_ref_elt);
-            elt; elt = cebs_item_next_dup(&ref->ceb_root, node, pattern, elt)) {
+       elt = cebs_item_lookup(&ref->ceb_root, node, pattern, key, struct pat_ref_elt);
+       while (elt) {
                if (elt->gen_id != gen_id)
                        continue;
+               next = cebs_item_next_dup(&ref->ceb_root, node, pattern, elt);
                pat_ref_delete_by_ptr(ref, elt);
                found = 1;
+               elt = next;
        }
 
        if (found)
@@ -1795,7 +1797,7 @@ static int pat_ref_set_from_elt(struct pat_ref *ref, struct pat_ref_elt *elt, co
                        gen = elt->gen_id;
                else if (elt->gen_id != gen) {
                        /* only consider duplicate elements from the same gen! */
-                       goto skip;
+                       continue;
                }
 
                if (!pat_ref_set_elt(ref, elt, value, &tmp_err)) {
@@ -1807,7 +1809,6 @@ static int pat_ref_set_from_elt(struct pat_ref *ref, struct pat_ref_elt *elt, co
                }
                found = 1;
                first = 0;
-       skip:
                elt = cebs_item_next_dup(&ref->ceb_root, node, pattern, elt);
        }