svn commit: r317773 - head/sys/netpfil/pf
Kristof Provost
kp at FreeBSD.org
Wed May 3 20:56:55 UTC 2017
Author: kp
Date: Wed May 3 20:56:54 2017
New Revision: 317773
URL: https://svnweb.freebsd.org/changeset/base/317773
Log:
pf: Fix panic on unload
vnet_pf_uninit() is called through vnet_deregister_sysuninit() and
linker_file_unload() when the pf module is unloaded. This is executed
after pf_unload() so we end up trying to take locks which have been
destroyed already.
Move pf_unload() to a separate SYSUNINIT() to ensure it's called after
all the vnet_pf_uninit() calls.
Differential Revision: https://reviews.freebsd.org/D10025
Modified:
head/sys/netpfil/pf/pf_ioctl.c
Modified: head/sys/netpfil/pf/pf_ioctl.c
==============================================================================
--- head/sys/netpfil/pf/pf_ioctl.c Wed May 3 20:56:34 2017 (r317772)
+++ head/sys/netpfil/pf/pf_ioctl.c Wed May 3 20:56:54 2017 (r317773)
@@ -178,7 +178,7 @@ static int hook_pf(void);
static int dehook_pf(void);
static int shutdown_pf(void);
static int pf_load(void);
-static int pf_unload(void);
+static void pf_unload(void);
static struct cdevsw pf_cdevsw = {
.d_ioctl = pfioctl,
@@ -3789,10 +3789,9 @@ pf_unload_vnet(void)
pf_mtag_cleanup();
}
-static int
+static void
pf_unload(void)
{
- int error = 0;
sx_xlock(&pf_end_lock);
pf_end_threads = 1;
@@ -3810,8 +3809,6 @@ pf_unload(void)
rw_destroy(&pf_rules_lock);
sx_destroy(&pf_ioctl_lock);
sx_destroy(&pf_end_lock);
-
- return (error);
}
static void
@@ -3829,6 +3826,7 @@ vnet_pf_uninit(const void *unused __unus
pf_unload_vnet();
}
+SYSUNINIT(pf_unload, SI_SUB_PROTO_FIREWALL, SI_ORDER_SECOND, pf_unload, NULL);
VNET_SYSUNINIT(vnet_pf_uninit, SI_SUB_PROTO_FIREWALL, SI_ORDER_THIRD,
vnet_pf_uninit, NULL);
@@ -3849,7 +3847,8 @@ pf_modevent(module_t mod, int type, void
error = EBUSY;
break;
case MOD_UNLOAD:
- error = pf_unload();
+ /* Handled in SYSUNINIT(pf_unload) to ensure it's done after
+ * the vnet_pf_uninit()s */
break;
default:
error = EINVAL;
More information about the svn-src-head
mailing list