Skip to content

Commit 5f0aa40

Browse files
Jack MorgensteinMukesh Kacker
authored andcommitted
ib_core: More fixes to ib_sa_add_one error flow
commit 0e7377eed fixed a resource leak of mad agents in the ib_sa_add_one error flow. However, the fix allowed ib_mad_unregister_agent to be called in a case where the ib_mad_register_agent request failed (resulting in an illegal pointer in the agent field). This caused a kernel Oops in the error flow. Fix this by calling ib_unregister_mad_agent only for cases where ib_register_mad_agent succeeded. In addition, separate the ib_register_event_handler() call error flow from the loop error flow. If the call to ib_register_event_handler fails, the client data must be reset to NULL, (in case at some point ib_register_event_handler() is modified so that it may return a non-zero (error) value). Signed-off-by: Jack Morgenstein <[email protected]> (Ported from Mellanox OFED 2.4) Signed-off-by: Mukesh Kacker <[email protected]>
1 parent fb8ea8a commit 5f0aa40

File tree

1 file changed

+6
-2
lines changed

1 file changed

+6
-2
lines changed

drivers/infiniband/core/sa_query.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1202,17 +1202,21 @@ static void ib_sa_add_one(struct ib_device *device)
12021202

12031203
INIT_IB_EVENT_HANDLER(&sa_dev->event_handler, device, ib_sa_event);
12041204
if (ib_register_event_handler(&sa_dev->event_handler))
1205-
goto err;
1205+
goto reg_err;
12061206

12071207
for (i = 0; i <= e - s; ++i)
12081208
if (rdma_port_get_link_layer(device, i + 1) == IB_LINK_LAYER_INFINIBAND)
12091209
update_sm_ah(&sa_dev->port[i].update_task);
12101210

12111211
return;
12121212

1213+
reg_err:
1214+
ib_set_client_data(device, &sa_client, NULL);
1215+
i = e - s;
12131216
err:
12141217
for (; i >= 0; --i)
1215-
if (rdma_port_get_link_layer(device, i + 1) == IB_LINK_LAYER_INFINIBAND)
1218+
if (rdma_port_get_link_layer(device, i + 1) == IB_LINK_LAYER_INFINIBAND &&
1219+
!IS_ERR(sa_dev->port[i].agent))
12161220
ib_unregister_mad_agent(sa_dev->port[i].agent);
12171221

12181222
kfree(sa_dev);

0 commit comments

Comments
 (0)