The branch stable/15 has been updated by pouria: URL: https://cgit.FreeBSD.org/src/commit/?id=7b4bad292d684323139e674bd9798114a3966f4e
commit 7b4bad292d684323139e674bd9798114a3966f4e Author: Pouria Mousavizadeh Tehrani <[email protected]> AuthorDate: 2026-07-06 16:23:56 +0000 Commit: Pouria Mousavizadeh Tehrani <[email protected]> CommitDate: 2026-07-13 20:48:26 +0000 if_ovpn: Fix memory leak in VNET during unload Unloading if_ovpn while it's in use by other vnets causes memory leaks and panics. Fix this by reverting VNET_SYSUNINIT and adjusting the SI_SUB initialization order. Reviewed by: markj MFC after: 1 week Differential Revision: https://reviews.freebsd.org/D54175 (cherry picked from commit bf142ea4760bd4391092d9cc0038a0870cf7e0b2) --- sys/net/if_ovpn.c | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/sys/net/if_ovpn.c b/sys/net/if_ovpn.c index b4796fb95589..19fab11f3dde 100644 --- a/sys/net/if_ovpn.c +++ b/sys/net/if_ovpn.c @@ -2847,9 +2847,19 @@ vnet_ovpn_init(const void *unused __unused) }; V_ovpn_cloner = ifc_attach_cloner(ovpngroupname, &req); } -VNET_SYSINIT(vnet_ovpn_init, SI_SUB_PSEUDO, SI_ORDER_ANY, +VNET_SYSINIT(vnet_ovpn_init, SI_SUB_PROTO_IFATTACHDOMAIN, SI_ORDER_ANY, vnet_ovpn_init, NULL); +static void +vnet_ovpn_uninit(void) +{ + + if (V_ovpn_cloner != NULL) + ifc_detach_cloner(V_ovpn_cloner); +} +VNET_SYSUNINIT(vnet_ovpn_uninit, SI_SUB_PROTO_IFATTACHDOMAIN, SI_ORDER_ANY, + vnet_ovpn_uninit, NULL); + static int ovpn_prison_remove(void *obj, void *data __unused) { @@ -2891,12 +2901,6 @@ ovpnmodevent(module_t mod, int type, void *data) case MOD_UNLOAD: if (ovpn_osd_jail_slot != 0) osd_jail_deregister(ovpn_osd_jail_slot); - CURVNET_SET(vnet0); - if (V_ovpn_cloner != NULL) { - ifc_detach_cloner(V_ovpn_cloner); - V_ovpn_cloner = NULL; - } - CURVNET_RESTORE(); break; default: return (EOPNOTSUPP); @@ -2911,6 +2915,6 @@ static moduledata_t ovpn_mod = { 0 }; -DECLARE_MODULE(if_ovpn, ovpn_mod, SI_SUB_PSEUDO, SI_ORDER_ANY); +DECLARE_MODULE(if_ovpn, ovpn_mod, SI_SUB_PROTO_IFATTACHDOMAIN, SI_ORDER_ANY); MODULE_VERSION(if_ovpn, 1); MODULE_DEPEND(if_ovpn, crypto, 1, 1, 1);
