]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: pattern: remerge the list and tree deletion functions
authorWilly Tarreau <w@1wt.eu>
Mon, 2 Nov 2020 18:53:16 +0000 (19:53 +0100)
committerWilly Tarreau <w@1wt.eu>
Thu, 5 Nov 2020 18:27:09 +0000 (19:27 +0100)
pat_del_tree_gen() was already chained onto pat_del_list_gen() to deal
with remaining cases, so let's complete the merge and have a generic
pattern deletion function acting on the reference and taking care of
reliably removing all elements.

include/haproxy/pattern.h
src/http_acl.c
src/pattern.c

index 0046a7f25fcdd804d25fcb8f3bb14c4a22b98de7..844bc9102ba1ffa65f0b2e230198e320946652ab 100644 (file)
@@ -78,12 +78,11 @@ int pat_idx_tree_pfx(struct pattern_expr *expr, struct pattern *pat, char **err)
 
 /*
  *
- * The following functions deletes all patterns related to reference pattern
+ * The following function deletes all patterns related to reference pattern
  * element <elt> in pattern refernce <ref>.
  *
  */
-void pat_del_list_gen(struct pat_ref *ref, struct pat_ref_elt *elt);
-void pat_del_tree_gen(struct pat_ref *ref, struct pat_ref_elt *elt);
+void pat_delete_gen(struct pat_ref *ref, struct pat_ref_elt *elt);
 
 /*
  *
index d4a0e4650a0c0844e1e3ce66a51cac8567a67d5d..d31592e9776dc25efe11cd6f4606875fe3006e96 100644 (file)
@@ -121,8 +121,8 @@ static struct acl_kw_list acl_kws = {ILH, {
         * and match method are related to the corresponding fetch methods. This
         * is very particular ACL declaration mode.
         */
-       { "http_auth_group", NULL,       PAT_MATCH_STR, NULL,  pat_idx_list_str, pat_del_list_gen, NULL, pat_match_auth },
-       { "method",          NULL,       PAT_MATCH_STR, pat_parse_meth, pat_idx_list_str, pat_del_list_gen, NULL, pat_match_meth },
+       { "http_auth_group", NULL,       PAT_MATCH_STR, NULL,  pat_idx_list_str, pat_delete_gen, NULL, pat_match_auth },
+       { "method",          NULL,       PAT_MATCH_STR, pat_parse_meth, pat_idx_list_str, pat_delete_gen, NULL, pat_match_meth },
 
        { "path",            "path",     PAT_MATCH_STR },
        { "path_beg",        "path",     PAT_MATCH_BEG },
index 2908bd001b145c750f4440060e307af51f724696..0a2032e6d93e05a13fd8bcdb0cb15b5ef865c794 100644 (file)
@@ -80,20 +80,20 @@ int (*pat_index_fcts[PAT_MATCH_NUM])(struct pattern_expr *, struct pattern *, ch
 };
 
 void (*pat_delete_fcts[PAT_MATCH_NUM])(struct pat_ref *, struct pat_ref_elt *) = {
-       [PAT_MATCH_FOUND] = pat_del_list_gen,
-       [PAT_MATCH_BOOL]  = pat_del_list_gen,
-       [PAT_MATCH_INT]   = pat_del_list_gen,
-       [PAT_MATCH_IP]    = pat_del_tree_gen,
-       [PAT_MATCH_BIN]   = pat_del_list_gen,
-       [PAT_MATCH_LEN]   = pat_del_list_gen,
-       [PAT_MATCH_STR]   = pat_del_tree_gen,
-       [PAT_MATCH_BEG]   = pat_del_tree_gen,
-       [PAT_MATCH_SUB]   = pat_del_list_gen,
-       [PAT_MATCH_DIR]   = pat_del_list_gen,
-       [PAT_MATCH_DOM]   = pat_del_list_gen,
-       [PAT_MATCH_END]   = pat_del_list_gen,
-       [PAT_MATCH_REG]   = pat_del_list_gen,
-       [PAT_MATCH_REGM]  = pat_del_list_gen,
+       [PAT_MATCH_FOUND] = pat_delete_gen,
+       [PAT_MATCH_BOOL]  = pat_delete_gen,
+       [PAT_MATCH_INT]   = pat_delete_gen,
+       [PAT_MATCH_IP]    = pat_delete_gen,
+       [PAT_MATCH_BIN]   = pat_delete_gen,
+       [PAT_MATCH_LEN]   = pat_delete_gen,
+       [PAT_MATCH_STR]   = pat_delete_gen,
+       [PAT_MATCH_BEG]   = pat_delete_gen,
+       [PAT_MATCH_SUB]   = pat_delete_gen,
+       [PAT_MATCH_DIR]   = pat_delete_gen,
+       [PAT_MATCH_DOM]   = pat_delete_gen,
+       [PAT_MATCH_END]   = pat_delete_gen,
+       [PAT_MATCH_REG]   = pat_delete_gen,
+       [PAT_MATCH_REGM]  = pat_delete_gen,
 };
 
 void (*pat_prune_fcts[PAT_MATCH_NUM])(struct pattern_expr *) = {
@@ -1402,15 +1402,26 @@ int pat_idx_tree_pfx(struct pattern_expr *expr, struct pattern *pat, char **err)
        return 1;
 }
 
-/* Deletes all list-based patterns from reference <elt>. Note that all of their
+/* Deletes all patterns from reference <elt>. Note that all of their
  * expressions must be locked, and the pattern lock must be held as well.
  */
-void pat_del_list_gen(struct pat_ref *ref, struct pat_ref_elt *elt)
+void pat_delete_gen(struct pat_ref *ref, struct pat_ref_elt *elt)
 {
-       struct pattern_list *pat;
-       struct pattern_list *safe;
+       struct pattern_tree *tree, *tree_bck;
+       struct pattern_list *pat, *pat_bck;
+
+       /* delete all known tree nodes. They are all allocated inline */
+       list_for_each_entry_safe(tree, tree_bck, &elt->tree_head, from_ref) {
+               BUG_ON(tree->ref != elt);
+
+               ebmb_delete(&tree->node);
+               LIST_DEL(&tree->from_ref);
+               free(tree->data);
+               free(tree);
+       }
 
-       list_for_each_entry_safe(pat, safe, &elt->list_head, from_ref) {
+       /* delete all list nodes and free their pattern entries (str/reg) */
+       list_for_each_entry_safe(pat, pat_bck, &elt->list_head, from_ref) {
                /* Check equality. */
                BUG_ON(pat->pat.ref != elt);
 
@@ -1424,27 +1435,9 @@ void pat_del_list_gen(struct pat_ref *ref, struct pat_ref_elt *elt)
                free(pat->pat.data);
                free(pat);
        }
-       ref->revision = rdtsc();
-}
-
-/* Deletes all tree-based patterns from reference <elt>. Note that all of their
- * expressions must be locked, and the pattern lock must be held as well.
- */
-void pat_del_tree_gen(struct pat_ref *ref, struct pat_ref_elt *elt)
-{
-       struct pattern_tree *tree, *tree_bck;
-
-       list_for_each_entry_safe(tree, tree_bck, &elt->tree_head, from_ref) {
-               BUG_ON(tree->ref != elt);
-
-               ebmb_delete(&tree->node);
-               LIST_DEL(&tree->from_ref);
-               free(tree->data);
-               free(tree);
-       }
 
-       /* Also check the lists ofr immediate IPs or case-insensitive strings */
-       pat_del_list_gen(ref, elt);
+       /* update revision number to refresh the cache */
+       ref->revision = rdtsc();
 }
 
 void pattern_init_expr(struct pattern_expr *expr)