mirror of
https://github.com/freebsd/freebsd-src.git
synced 2026-10-29 11:54:38 +01:00
pf: fix struct pf_krule_global leak
Make sure we free all of the trees we allocated when we free the ruleset.
Found by 'kldunload pf' after a test run, now that the allocation is done from a
pf-specific malloc type.
Sponsored by: Rubicon Communications, LLC ("Netgate")
This commit is contained in:
1 parent
44cc3b2731
commit
275ff85b25
3 files changed
+8
-1
No files matched your search
@@ -2614,6 +2614,7 @@ struct pf_kruleset *pf_find_kruleset(const char *);
|
||||
struct pf_kruleset *pf_get_leaf_kruleset(char *, char **);
|
||||
struct pf_kruleset *pf_find_or_create_kruleset(const char *);
|
||||
void pf_rs_initialize(void);
|
||||
void pf_rule_tree_free(struct pf_krule_global *);
|
||||
|
||||
|
||||
struct pf_krule *pf_krule_alloc(void);
|
||||
|
||||
@@ -1189,7 +1189,7 @@ pf_rule_tree_alloc(int flags)
|
||||
return (tree);
|
||||
}
|
||||
|
||||
static void
|
||||
void
|
||||
pf_rule_tree_free(struct pf_krule_global *tree)
|
||||
{
|
||||
|
||||
|
||||
@@ -336,6 +336,12 @@ pf_remove_if_empty_kruleset(struct pf_kruleset *ruleset)
|
||||
int i;
|
||||
|
||||
while (ruleset != NULL) {
|
||||
for (int i = 0; i < PF_RULESET_MAX; i++) {
|
||||
pf_rule_tree_free(ruleset->rules[i].active.tree);
|
||||
ruleset->rules[i].active.tree = NULL;
|
||||
pf_rule_tree_free(ruleset->rules[i].inactive.tree);
|
||||
ruleset->rules[i].inactive.tree = NULL;
|
||||
}
|
||||
if (ruleset == &pf_main_ruleset ||
|
||||
!RB_EMPTY(&ruleset->anchor->children) ||
|
||||
ruleset->anchor->refcnt > 0 || ruleset->tables > 0 ||
|
||||
|
||||
Reference in new issue
Block a user