]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
devlink: fix possible use-after-free and memory leaks in devlink_init()
authorVasiliy Kovalev <kovalev@altlinux.org>
Thu, 15 Feb 2024 20:34:00 +0000 (23:34 +0300)
committerPaolo Abeni <pabeni@redhat.com>
Tue, 20 Feb 2024 09:17:46 +0000 (10:17 +0100)
The pernet operations structure for the subsystem must be registered
before registering the generic netlink family.

Make an unregister in case of unsuccessful registration.

Fixes: 687125b5799c ("devlink: split out core code")
Signed-off-by: Vasiliy Kovalev <kovalev@altlinux.org>
Link: https://lore.kernel.org/r/20240215203400.29976-1-kovalev@altlinux.org
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
net/devlink/core.c

index 6a58342752b4690d1f13d19eb94ee1d44b9cda61..7f0b093208d75b91e25cb78a73bece8ef2577831 100644 (file)
@@ -529,14 +529,20 @@ static int __init devlink_init(void)
 {
        int err;
 
-       err = genl_register_family(&devlink_nl_family);
-       if (err)
-               goto out;
        err = register_pernet_subsys(&devlink_pernet_ops);
        if (err)
                goto out;
+       err = genl_register_family(&devlink_nl_family);
+       if (err)
+               goto out_unreg_pernet_subsys;
        err = register_netdevice_notifier(&devlink_port_netdevice_nb);
+       if (!err)
+               return 0;
+
+       genl_unregister_family(&devlink_nl_family);
 
+out_unreg_pernet_subsys:
+       unregister_pernet_subsys(&devlink_pernet_ops);
 out:
        WARN_ON(err);
        return err;