mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2025-09-20 13:21:29 +02:00
Revert "BUG/MEDIUM: pattern: fix possible infinite loops on deletion"
This reverts commit 359a829ccb8693e0b29808acc0fa7975735c0353. The fix is neither sufficient nor correct (it triggers ASAN). Better redo it cleanly rather than accumulate invalid fixes.
This commit is contained in:
parent
6b6c03bc0d
commit
f1b1d3682a
@ -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)
|
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;
|
int found = 0;
|
||||||
|
|
||||||
/* delete pattern from reference */
|
/* delete pattern from reference */
|
||||||
for (elt = cebs_item_lookup(&ref->ceb_root, node, pattern, key, struct pat_ref_elt);
|
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)) {
|
while (elt) {
|
||||||
if (elt->gen_id != gen_id)
|
if (elt->gen_id != gen_id)
|
||||||
continue;
|
continue;
|
||||||
|
next = cebs_item_next_dup(&ref->ceb_root, node, pattern, elt);
|
||||||
pat_ref_delete_by_ptr(ref, elt);
|
pat_ref_delete_by_ptr(ref, elt);
|
||||||
found = 1;
|
found = 1;
|
||||||
|
elt = next;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (found)
|
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;
|
gen = elt->gen_id;
|
||||||
else if (elt->gen_id != gen) {
|
else if (elt->gen_id != gen) {
|
||||||
/* only consider duplicate elements from the same gen! */
|
/* only consider duplicate elements from the same gen! */
|
||||||
goto skip;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!pat_ref_set_elt(ref, elt, value, &tmp_err)) {
|
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;
|
found = 1;
|
||||||
first = 0;
|
first = 0;
|
||||||
skip:
|
|
||||||
elt = cebs_item_next_dup(&ref->ceb_root, node, pattern, elt);
|
elt = cebs_item_next_dup(&ref->ceb_root, node, pattern, elt);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user