summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPablo Neira Ayuso <pablo@netfilter.org>2015-07-06 14:29:33 +0200
committerPablo Neira Ayuso <pablo@netfilter.org>2015-08-18 01:13:35 +0200
commit327554218c59902965a160b71c7b6021a0d8bf4b (patch)
tree5af22ea3f55a3fde432e2e01f983df92728336c2 /src
parentc54fbd53c73fd0426329bfbeaa99bdda244542a9 (diff)
rule: add chain reference counter
When adding declared chains to the cache, we may hold more than one single reference from struct cmd and the cache. Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
Diffstat (limited to 'src')
-rw-r--r--src/rule.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/src/rule.c b/src/rule.c
index 6e1b823a..6887a1a7 100644
--- a/src/rule.c
+++ b/src/rule.c
@@ -444,6 +444,7 @@ struct chain *chain_alloc(const char *name)
struct chain *chain;
chain = xzalloc(sizeof(*chain));
+ chain->refcnt = 1;
init_list_head(&chain->rules);
init_list_head(&chain->scope.symbols);
if (name != NULL)
@@ -453,10 +454,18 @@ struct chain *chain_alloc(const char *name)
return chain;
}
+struct chain *chain_get(struct chain *chain)
+{
+ chain->refcnt++;
+ return chain;
+}
+
void chain_free(struct chain *chain)
{
struct rule *rule, *next;
+ if (--chain->refcnt > 0)
+ return;
list_for_each_entry_safe(rule, next, &chain->rules, list)
rule_free(rule);
handle_free(&chain->handle);