diff options
author | Vasiliy Kovalev <kovalev@altlinux.org> | 2024-02-15 23:34:00 +0300 |
---|---|---|
committer | Paolo Abeni <pabeni@redhat.com> | 2024-02-20 10:17:46 +0100 |
commit | def689fc26b9a9622d2e2cb0c4933dd3b1c8071c (patch) | |
tree | 9d9c59c7807b36e1469713b19ca4092368d610bc /net/devlink/core.c | |
parent | 5559cea2d5aa3018a5f00dd2aca3427ba09b386b (diff) | |
download | lwn-def689fc26b9a9622d2e2cb0c4933dd3b1c8071c.tar.gz lwn-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/core.c')
-rw-r--r-- | net/devlink/core.c | 12 |
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; |