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

Reply via email to