Skip to content

Commit 07c0d13

Browse files
Chen Zhongjinjgunthorpe
authored andcommitted
RDMA/core: Fix null-ptr-deref in ib_core_cleanup()
KASAN reported a null-ptr-deref error: KASAN: null-ptr-deref in range [0x0000000000000118-0x000000000000011f] CPU: 1 PID: 379 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996) RIP: 0010:destroy_workqueue+0x2f/0x740 RSP: 0018:ffff888016137df8 EFLAGS: 00000202 ... Call Trace: ib_core_cleanup+0xa/0xa1 [ib_core] __do_sys_delete_module.constprop.0+0x34f/0x5b0 do_syscall_64+0x3a/0x90 entry_SYSCALL_64_after_hwframe+0x63/0xcd RIP: 0033:0x7fa1a0d221b7 ... It is because the fail of roce_gid_mgmt_init() is ignored: ib_core_init() roce_gid_mgmt_init() gid_cache_wq = alloc_ordered_workqueue # fail ... ib_core_cleanup() roce_gid_mgmt_cleanup() destroy_workqueue(gid_cache_wq) # destroy an unallocated wq Fix this by catching the fail of roce_gid_mgmt_init() in ib_core_init(). Fixes: 03db3a2 ("IB/core: Add RoCE GID table management") Signed-off-by: Chen Zhongjin <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Leon Romanovsky <[email protected]> Signed-off-by: Jason Gunthorpe <[email protected]>
1 parent b5f9a01 commit 07c0d13

File tree

2 files changed

+10
-2
lines changed

2 files changed

+10
-2
lines changed

drivers/infiniband/core/device.c

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2815,10 +2815,18 @@ static int __init ib_core_init(void)
28152815

28162816
nldev_init();
28172817
rdma_nl_register(RDMA_NL_LS, ibnl_ls_cb_table);
2818-
roce_gid_mgmt_init();
2818+
ret = roce_gid_mgmt_init();
2819+
if (ret) {
2820+
pr_warn("Couldn't init RoCE GID management\n");
2821+
goto err_parent;
2822+
}
28192823

28202824
return 0;
28212825

2826+
err_parent:
2827+
rdma_nl_unregister(RDMA_NL_LS);
2828+
nldev_exit();
2829+
unregister_pernet_device(&rdma_dev_net_ops);
28222830
err_compat:
28232831
unregister_blocking_lsm_notifier(&ibdev_lsm_nb);
28242832
err_sa:

drivers/infiniband/core/nldev.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2537,7 +2537,7 @@ void __init nldev_init(void)
25372537
rdma_nl_register(RDMA_NL_NLDEV, nldev_cb_table);
25382538
}
25392539

2540-
void __exit nldev_exit(void)
2540+
void nldev_exit(void)
25412541
{
25422542
rdma_nl_unregister(RDMA_NL_NLDEV);
25432543
}

0 commit comments

Comments
 (0)