From dd90ff7a21981a96c1cefbe7d0a6de52a0a62758 Mon Sep 17 00:00:00 2001 From: JinYu Date: Fri, 12 Apr 2019 17:36:50 +0800 Subject: [PATCH] nvmf/rdma: fix bugs in spdk_nvmf_rdma_qpair_destroy Rqpair qp and resources maybe not be created, if rqpair fail to initialise. For example, in function new_qpair, the code run to spdk_nvmf_qpair_disconnect, but rqpair is initialised in poll_group_add. Fix #557 segmentaion fault(core dump) Change-Id: I1892e6d13e2d53dd5a7c4856d775f9b3b85da961 Signed-off-by: JinYu Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/450986 Tested-by: SPDK CI Jenkins Reviewed-by: Seth Howell Reviewed-by: Hailiang Wang Reviewed-by: Changpeng Liu Reviewed-by: Ben Walker --- lib/nvmf/rdma.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/lib/nvmf/rdma.c b/lib/nvmf/rdma.c index 725ee4852..f3a707169 100644 --- a/lib/nvmf/rdma.c +++ b/lib/nvmf/rdma.c @@ -863,7 +863,7 @@ spdk_nvmf_rdma_qpair_destroy(struct spdk_nvmf_rdma_qpair *rqpair) if (rqpair->poller) { TAILQ_REMOVE(&rqpair->poller->qpairs, rqpair, link); - if (rqpair->srq != NULL) { + if (rqpair->srq != NULL && rqpair->resources != NULL) { /* Drop all received but unprocessed commands for this queue and return them to SRQ */ STAILQ_FOREACH_SAFE(rdma_recv, &rqpair->resources->incoming_queue, link, recv_tmp) { if (rqpair == rdma_recv->qpair) { @@ -878,7 +878,9 @@ spdk_nvmf_rdma_qpair_destroy(struct spdk_nvmf_rdma_qpair *rqpair) } if (rqpair->cm_id) { - rdma_destroy_qp(rqpair->cm_id); + if (rqpair->cm_id->qp != NULL) { + rdma_destroy_qp(rqpair->cm_id); + } rdma_destroy_id(rqpair->cm_id); if (rqpair->poller != NULL && rqpair->srq == NULL) { @@ -886,7 +888,7 @@ spdk_nvmf_rdma_qpair_destroy(struct spdk_nvmf_rdma_qpair *rqpair) } } - if (rqpair->srq == NULL) { + if (rqpair->srq == NULL && rqpair->resources != NULL) { nvmf_rdma_resources_destroy(rqpair->resources); }