diff options
author | Jason A. Donenfeld <Jason@zx2c4.com> | 2021-05-03 17:22:47 +0200 |
---|---|---|
committer | Jason A. Donenfeld <Jason@zx2c4.com> | 2021-05-03 19:55:50 +0200 |
commit | 47f0fccb8613268c1f7f5854292fcd223285dc47 (patch) | |
tree | 5d9f8761f5f0159bc18efdd14ffc6d290fc50f97 | |
parent | TODO: add note about excessive rw locks (diff) | |
download | wireguard-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.c | 17 |
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 }; |