summaryrefslogtreecommitdiffstats
path: root/net/devlink
diff options
context:
space:
mode:
authorVasiliy Kovalev <kovalev@altlinux.org>2024-02-15 21:34:00 +0100
committerPaolo Abeni <pabeni@redhat.com>2024-02-20 10:17:46 +0100
commitdef689fc26b9a9622d2e2cb0c4933dd3b1c8071c (patch)
tree9d9c59c7807b36e1469713b19ca4092368d610bc /net/devlink
parentipv6: sr: fix possible use-after-free and null-ptr-deref (diff)
downloadlinux-def689fc26b9a9622d2e2cb0c4933dd3b1c8071c.tar.xz
linux-def689fc26b9a9622d2e2cb0c4933dd3b1c8071c.zip
devlink: fix possible use-after-free and memory leaks in devlink_init()
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>
Diffstat (limited to 'net/devlink')
-rw-r--r--net/devlink/core.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/net/devlink/core.c b/net/devlink/core.c
index 6a58342752b4..7f0b093208d7 100644
--- a/net/devlink/core.c
+++ b/net/devlink/core.c
@@ -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;