aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPouria Mousavizadeh Tehrani <pouria@FreeBSD.org>2026-07-06 16:23:56 +0000
committerPouria Mousavizadeh Tehrani <pouria@FreeBSD.org>2026-07-06 17:13:53 +0000
commitbf142ea4760bd4391092d9cc0038a0870cf7e0b2 (patch)
tree875a7ef645798aee705b01f00671433c923e1fca
parent7a0b9e30a5ba07066caffba51fa82ca3782a5da1 (diff)
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
-rw-r--r--sys/net/if_ovpn.c20
1 files 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);