]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/commit
wg: fix a number of issues with module load failure handling
authorKyle Evans <kevans@FreeBSD.org>
Wed, 21 Jun 2023 18:56:58 +0000 (13:56 -0500)
committerKyle Evans <kevans@FreeBSD.org>
Fri, 23 Jun 2023 17:00:09 +0000 (12:00 -0500)
commitb08ee10c0646e683cd03c9e28f537d9a7ba306af
tree8ea5d8a8dfbe847a3fa944910e69377ff5abc89a
parentad9f4e6351fb23ee81bc940638d20af3ca7c278d
wg: fix a number of issues with module load failure handling

If MOD_LOAD fails, then MOD_UNLOAD will be called to unwind module
state, but wg_module_init() will have already deinitialized everything
it needs to in a manner that renders it unsafe to call MOD_UNLOAD
after (e.g., freed zone not reset to NULL, wg_osd_jail_slot not reset
to 0).  Let's simply stop trying to handle freeing everything in
wg_module_init() to simplify it; let the subsequent MOD_UNLOAD deal with
it, and let's make that robust against partially-constructed state.

jhb@ notes that MOD_UNLOAD being called if MOD_LOAD fails is kind of an
anomaly that doesn't match other paradigms in the kernel; e.g., if
device_attach() fails, we don't invoke device_detach().  It's likely
that a future commit will revert this and instead stop calling
MOD_UNLOAD if MOD_LOAD fails, expecting modules to clean up after
themselves in MOD_LOAD upon failure.  Some other modules already do this
and may see similar problems to the wg module (see: carp).  The proper
fix is decidedly a bit too invasive to do this close to 14 branching,
and it requires auditing all kmods (base + ports) for potential leaks.

PR: 272089
Reviewed by: emaste
MFC after: 3 days
Differential Revision: https://reviews.freebsd.org/D40708
sys/dev/wg/if_wg.c
sys/dev/wg/wg_cookie.c