git: bf142ea4760b - main - if_ovpn: Fix memory leak in VNET during unload
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Mon, 06 Jul 2026 17:15:21 UTC
The branch main has been updated by pouria:
URL: https://cgit.FreeBSD.org/src/commit/?id=bf142ea4760bd4391092d9cc0038a0870cf7e0b2
commit bf142ea4760bd4391092d9cc0038a0870cf7e0b2
Author: Pouria Mousavizadeh Tehrani <pouria@FreeBSD.org>
AuthorDate: 2026-07-06 16:23:56 +0000
Commit: Pouria Mousavizadeh Tehrani <pouria@FreeBSD.org>
CommitDate: 2026-07-06 17:13:53 +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
---
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);