Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 13 Jul 2026 20:49:47 +0000
From:      Pouria Mousavizadeh Tehrani <pouria@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org
Subject:   git: 7b4bad292d68 - stable/15 - if_ovpn: Fix memory leak in VNET during unload
Message-ID:  <6a554f6b.38877.33f44206@gitrepo.freebsd.org>

index | next in thread | raw e-mail

The branch stable/15 has been updated by pouria:

URL: https://cgit.FreeBSD.org/src/commit/?id=7b4bad292d684323139e674bd9798114a3966f4e

commit 7b4bad292d684323139e674bd9798114a3966f4e
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-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);


home | help

Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?6a554f6b.38877.33f44206>