From 9b5c8bbc89541bee761e4c9eb9f8c5ba18c8a7b9 Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Mon, 2 Nov 2020 19:16:23 +0100 Subject: [PATCH] MINOR: pattern: new sflag PAT_SF_REGFREE indicates regex_free() is needed Currently we have no way to know how to delete/prune a pattern in a generic way. A pattern doesn't contain its own type so we don't know what function to call. Tree nodes are roughly OK but not lists where regex are possible. Let's add one new bit for sflags at index time to indicate that regex_free() will be needed upon deletion. It's not used for now. --- include/haproxy/pattern-t.h | 1 + src/pattern.c | 1 + 2 files changed, 2 insertions(+) diff --git a/include/haproxy/pattern-t.h b/include/haproxy/pattern-t.h index aa77c9aa7..b5b4d0beb 100644 --- a/include/haproxy/pattern-t.h +++ b/include/haproxy/pattern-t.h @@ -69,6 +69,7 @@ enum { /* possible flags for patterns storage */ enum { PAT_SF_TREE = 1 << 0, /* some patterns are arranged in a tree */ + PAT_SF_REGFREE = 1 << 1, /* run regex_free() on the pointer */ }; /* ACL match methods */ diff --git a/src/pattern.c b/src/pattern.c index e4a1e2785..5c83a5ca9 100644 --- a/src/pattern.c +++ b/src/pattern.c @@ -1240,6 +1240,7 @@ int pat_idx_list_reg_cap(struct pattern_expr *expr, struct pattern *pat, int cap memcpy(&patl->pat, pat, sizeof(*pat)); /* compile regex */ + patl->pat.sflags |= PAT_SF_REGFREE; if (!(patl->pat.ptr.reg = regex_comp(pat->ptr.str, !(expr->mflags & PAT_MF_IGNORE_CASE), cap, err))) { free(patl);