git: bf142ea4760b - main - if_ovpn: Fix memory leak in VNET during unload

From: Pouria Mousavizadeh Tehrani <pouria_at_FreeBSD.org>
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);