summaryrefslogtreecommitdiffstats
path: root/sys/netinet
diff options
context:
space:
mode:
authorthompsa <thompsa@FreeBSD.org>2005-10-12 19:52:16 +0000
committerthompsa <thompsa@FreeBSD.org>2005-10-12 19:52:16 +0000
commitd6130a47038460d2093bdc0fcdadd546393cc823 (patch)
treee685414c2d4a9a0e96a99f9d18fa6ce3780a6fbe /sys/netinet
parent1917bf7b66cadbb6cbcc022f50fb4252b6996ff7 (diff)
downloadFreeBSD-src-d6130a47038460d2093bdc0fcdadd546393cc823.zip
FreeBSD-src-d6130a47038460d2093bdc0fcdadd546393cc823.tar.gz
Change the reference counting to count the number of cloned interfaces for each
cloner. This ensures that ifc->ifc_units is not prematurely freed in if_clone_detach() before the clones are destroyed, resulting in memory modified after free. This could be triggered with if_vlan. Assert that all cloners have been destroyed when freeing the memory. Change all simple cloners to destroy their clones with ifc_simple_destroy() on module unload so the reference count is properly updated. This also cleans up the interface destroy routines and allows future optimisation. Discussed with: brooks, pjd, -current Reviewed by: brooks
Diffstat (limited to 'sys/netinet')
-rw-r--r--sys/netinet/ip_carp.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/sys/netinet/ip_carp.c b/sys/netinet/ip_carp.c
index 7dd72c1..0e55543 100644
--- a/sys/netinet/ip_carp.c
+++ b/sys/netinet/ip_carp.c
@@ -2144,7 +2144,8 @@ carp_modevent(module_t mod, int type, void *data)
case MOD_UNLOAD:
if_clone_detach(&carp_cloner);
while (!LIST_EMPTY(&carpif_list))
- carp_clone_destroy(SC2IFP(LIST_FIRST(&carpif_list)));
+ ifc_simple_destroy(&carp_cloner,
+ SC2IFP(LIST_FIRST(&carpif_list)));
mtx_destroy(&carp_mtx);
break;
OpenPOWER on IntegriCloud