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>
This commit is contained in:
Jason A. Donenfeld 2021-05-03 17:22:47 +02:00
parent 31d3186a6d
commit 47f0fccb86
1 changed files with 13 additions and 4 deletions

View File

@ -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
};