From 766479f4d6455734510859a0dc8c82910484eca0 Mon Sep 17 00:00:00 2001 From: glebius Date: Thu, 16 Oct 2014 23:03:04 +0000 Subject: [PATCH] Merge r273184, r273185 from stable/10: - Use rn_detachhead() instead of direct free(9) for radix tables. - Free radix mask entries on main radix destroy. PR: 194078 Approved by: re (gjb) git-svn-id: svn://svn.freebsd.org/base/releng/10.1@273196 ccf9f872-aa2e-dd11-9fc8-001c23d0bc1f --- sys/net/radix.c | 13 +++++++++++++ sys/netpfil/pf/pf_table.c | 4 ++-- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/sys/net/radix.c b/sys/net/radix.c index 5bf9dffbe..b71539842 100644 --- a/sys/net/radix.c +++ b/sys/net/radix.c @@ -1204,6 +1204,18 @@ rn_inithead(void **head, int off) return (1); } +static int +rn_freeentry(struct radix_node *rn, void *arg) +{ + struct radix_node_head * const rnh = arg; + struct radix_node *x; + + x = (struct radix_node *)rn_delete(rn + 2, NULL, rnh); + if (x != NULL) + Free(x); + return (0); +} + int rn_detachhead(void **head) { @@ -1214,6 +1226,7 @@ rn_detachhead(void **head) rnh = *head; + rn_walktree(rnh->rnh_masks, rn_freeentry, rnh->rnh_masks); rn_detachhead_internal((void **)&rnh->rnh_masks); rn_detachhead_internal(head); return (1); diff --git a/sys/netpfil/pf/pf_table.c b/sys/netpfil/pf/pf_table.c index 595a365d8..1dd009516 100644 --- a/sys/netpfil/pf/pf_table.c +++ b/sys/netpfil/pf/pf_table.c @@ -1854,11 +1854,11 @@ pfr_destroy_ktable(struct pfr_ktable *kt, int flushaddr) } if (kt->pfrkt_ip4 != NULL) { RADIX_NODE_HEAD_DESTROY(kt->pfrkt_ip4); - free((caddr_t)kt->pfrkt_ip4, M_RTABLE); + rn_detachhead((void **)&kt->pfrkt_ip4); } if (kt->pfrkt_ip6 != NULL) { RADIX_NODE_HEAD_DESTROY(kt->pfrkt_ip6); - free((caddr_t)kt->pfrkt_ip6, M_RTABLE); + rn_detachhead((void **)&kt->pfrkt_ip6); } if (kt->pfrkt_shadow != NULL) pfr_destroy_ktable(kt->pfrkt_shadow, flushaddr); -- 2.42.0