Skip to content

Commit 9817d76

Browse files
Ruozhu LiChristoph Hellwig
authored andcommitted
nvme-rdma: destroy cm id before destroy qp to avoid use after free
We should always destroy cm_id before destroy qp to avoid to get cma event after qp was destroyed, which may lead to use after free. In RDMA connection establishment error flow, don't destroy qp in cm event handler.Just report cm_error to upper level, qp will be destroy in nvme_rdma_alloc_queue() after destroy cm id. Signed-off-by: Ruozhu Li <liruozhu@huawei.com> Reviewed-by: Max Gurtovoy <mgurtovoy@nvidia.com> Signed-off-by: Christoph Hellwig <hch@lst.de>
1 parent 79f528a commit 9817d76

File tree

1 file changed

+3
-13
lines changed

1 file changed

+3
-13
lines changed

drivers/nvme/host/rdma.c

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -656,8 +656,8 @@ static void nvme_rdma_free_queue(struct nvme_rdma_queue *queue)
656656
if (!test_and_clear_bit(NVME_RDMA_Q_ALLOCATED, &queue->flags))
657657
return;
658658

659-
nvme_rdma_destroy_queue_ib(queue);
660659
rdma_destroy_id(queue->cm_id);
660+
nvme_rdma_destroy_queue_ib(queue);
661661
mutex_destroy(&queue->queue_lock);
662662
}
663663

@@ -1815,14 +1815,10 @@ static int nvme_rdma_conn_established(struct nvme_rdma_queue *queue)
18151815
for (i = 0; i < queue->queue_size; i++) {
18161816
ret = nvme_rdma_post_recv(queue, &queue->rsp_ring[i]);
18171817
if (ret)
1818-
goto out_destroy_queue_ib;
1818+
return ret;
18191819
}
18201820

18211821
return 0;
1822-
1823-
out_destroy_queue_ib:
1824-
nvme_rdma_destroy_queue_ib(queue);
1825-
return ret;
18261822
}
18271823

18281824
static int nvme_rdma_conn_rejected(struct nvme_rdma_queue *queue,
@@ -1916,14 +1912,10 @@ static int nvme_rdma_route_resolved(struct nvme_rdma_queue *queue)
19161912
if (ret) {
19171913
dev_err(ctrl->ctrl.device,
19181914
"rdma_connect_locked failed (%d).\n", ret);
1919-
goto out_destroy_queue_ib;
1915+
return ret;
19201916
}
19211917

19221918
return 0;
1923-
1924-
out_destroy_queue_ib:
1925-
nvme_rdma_destroy_queue_ib(queue);
1926-
return ret;
19271919
}
19281920

19291921
static int nvme_rdma_cm_handler(struct rdma_cm_id *cm_id,
@@ -1954,8 +1946,6 @@ static int nvme_rdma_cm_handler(struct rdma_cm_id *cm_id,
19541946
case RDMA_CM_EVENT_ROUTE_ERROR:
19551947
case RDMA_CM_EVENT_CONNECT_ERROR:
19561948
case RDMA_CM_EVENT_UNREACHABLE:
1957-
nvme_rdma_destroy_queue_ib(queue);
1958-
fallthrough;
19591949
case RDMA_CM_EVENT_ADDR_ERROR:
19601950
dev_dbg(queue->ctrl->ctrl.device,
19611951
"CM error event %d\n", ev->event);

0 commit comments

Comments
 (0)