aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJason A. Donenfeld <Jason@zx2c4.com>2021-05-03 17:22:47 +0200
committerJason A. Donenfeld <Jason@zx2c4.com>2021-05-03 19:55:50 +0200
commit47f0fccb8613268c1f7f5854292fcd223285dc47 (patch)
tree5d9f8761f5f0159bc18efdd14ffc6d290fc50f97
parentTODO: add note about excessive rw locks (diff)
downloadwireguard-freebsd-47f0fccb8613268c1f7f5854292fcd223285dc47.tar.xz
wireguard-freebsd-47f0fccb8613268c1f7f5854292fcd223285dc47.zip
if_wg: destroy interfaces before uma zone
Fixes: #12 0xffffffff80f20105 in uma_zalloc_arg (zone=<optimized out>, udata=<optimized out>, udata@entry=0x0, flags=flags@entry=257) at /usr/src/sys/vm/uma_core.c:3420 #13 0xffffffff82922844 in uma_zalloc (zone=<unavailable>, flags=257) at /usr/src/sys/vm/uma.h:358 #14 wg_packet_alloc (m=0xfffff801154bfa00) at if_wg.c:1769 #15 wg_send_keepalive (peer=0xfffff800075dd000, peer@entry=<error reading variable: value is not available>) at if_wg.c:1291 Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-rw-r--r--src/if_wg.c17
1 files changed, 13 insertions, 4 deletions
diff --git a/src/if_wg.c b/src/if_wg.c
index 678f1d1..2ab9a99 100644
--- a/src/if_wg.c
+++ b/src/if_wg.c
@@ -2948,7 +2948,8 @@ VNET_SYSINIT(vnet_wg_init, SI_SUB_PROTO_IFATTACHDOMAIN, SI_ORDER_ANY,
static void
vnet_wg_uninit(const void *unused __unused)
{
- if_clone_detach(V_wg_cloner);
+ if (V_wg_cloner)
+ if_clone_detach(V_wg_cloner);
}
VNET_SYSUNINIT(vnet_wg_uninit, SI_SUB_PROTO_IFATTACHDOMAIN, SI_ORDER_ANY,
vnet_wg_uninit, NULL);
@@ -3021,10 +3022,18 @@ free_none:
static void
wg_module_deinit(void)
{
- uma_zdestroy(wg_packet_zone);
+ VNET_ITERATOR_DECL(vnet_iter);
+ VNET_LIST_RLOCK();
+ VNET_FOREACH(vnet_iter) {
+ if_clone_detach(VNET_VNET(vnet_iter, wg_cloner));
+ VNET_VNET(vnet_iter, wg_cloner) = NULL;
+ }
+ VNET_LIST_RUNLOCK();
+ NET_EPOCH_WAIT();
+ MPASS(LIST_EMPTY(&wg_list));
osd_jail_deregister(wg_osd_jail_slot);
cookie_deinit();
- MPASS(LIST_EMPTY(&wg_list));
+ uma_zdestroy(wg_packet_zone);
}
static int
@@ -3043,7 +3052,7 @@ wg_module_event_handler(module_t mod, int what, void *arg)
}
static moduledata_t wg_moduledata = {
- "wg",
+ wgname,
wg_module_event_handler,
NULL
};