Received: by 2002:a05:6a11:4021:0:0:0:0 with SMTP id ky33csp4159075pxb; Mon, 27 Sep 2021 10:35:26 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwGWviCukSb1lJMsMPwZSstgW/dvEuQA4OOPqPWWdEcUd3QW6ralYxrq//Rm8wdZPH5darC X-Received: by 2002:a17:90a:c7c9:: with SMTP id gf9mr330496pjb.136.1632764126019; Mon, 27 Sep 2021 10:35:26 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1632764126; cv=none; d=google.com; s=arc-20160816; b=mjWmr3Ehbr8Dmtx4CMCD/N1wC68OPY1bT3JeTGjM0mSgRb7k21VvPZgf2LNb7usekO F1momwfs3IZJCLt4O0PTGiXC3ij7kDlTYjsfyvsKpd8579dLzO1APi5pHFjSRNWyhE1x FOT4jAlRsz1VmzTR3H+UtjKtyF5thNXTsFV4YhE2NKbYCPg1N8O461dGma2raAAk6eUg 3TdIsGK6cUmSCbh8EByHQbcKftGa0Gs8zmcw4yAzEGKxFbSKpgBwuBuokh9+WCnsSCoD 7ErD+02G7vQnEjp5ZXlL05nfZN/b+ZJeBA2WNhYwrqw2LlD29JFzfbzlUdy9gTldQMoJ N1yg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=4QmnJRkemGfnxqclUxv+tFV7lEDG5KBTatkyBIlsT/E=; b=iokG4ak+ygYXP6I/Nf1w2NbhMIUbY8hKEEfNFxmYZBVe5+Nr9x/htebDjGmf0B/itZ CUlPn0UnRezUn+CM/XDoG/NkswWEzHgfCDx79/y6UkEpo06sACbrreHU1m9JDiLKNLxQ dWa4BnuZ4pRwJNDJIdWuHDx0Heg364jaXlMCoVbhzCIshlmL1U/8cNqx3UgKerpovurG oNxxWuF1R3X7LZ3+s6ULA/ZFdpU6XIuR8sqlOntEI/EGMAns8Zi0LAjvFPOINwv68rji fw9OCijrdImtFsBch4mseLEceV8ndc9WCEtPOXhnd9FOoArpaS9hAJkyXhW6J1EYS9yN GsIQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=iFR4xMFl; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id s24si20466280pfm.7.2021.09.27.10.35.11; Mon, 27 Sep 2021 10:35:26 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=iFR4xMFl; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S237736AbhI0RgC (ORCPT + 99 others); Mon, 27 Sep 2021 13:36:02 -0400 Received: from mail.kernel.org ([198.145.29.99]:47536 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S238699AbhI0RaF (ORCPT ); Mon, 27 Sep 2021 13:30:05 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 23A0160F3A; Mon, 27 Sep 2021 17:18:01 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1632763081; bh=Ixvjd/g6Oa1T/tgj7QZQCeD2Fi27lJOPX8R02O1CA+A=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=iFR4xMFlzsqWfc3WWMWXfCbqVLs7hHXvp4zObLMP8iTNihTUKRj3o1HFMr8YoY9h+ TOFyL062osMGEKntiOYMcg/D5GJAS2g6qi51mkZGK2824P5Z0NfvXEELVnFl1fMNfZ c0BK13ZDMyh2XxDif7XCNFwhbXtWJNP2z9XT3wu0= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Ruozhu Li , Max Gurtovoy , Christoph Hellwig , Sasha Levin Subject: [PATCH 5.14 128/162] nvme-rdma: destroy cm id before destroy qp to avoid use after free Date: Mon, 27 Sep 2021 19:02:54 +0200 Message-Id: <20210927170237.862703782@linuxfoundation.org> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20210927170233.453060397@linuxfoundation.org> References: <20210927170233.453060397@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Ruozhu Li [ Upstream commit 9817d763dbe15327b9b3ff4404fa6f27f927e744 ] 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 Reviewed-by: Max Gurtovoy Signed-off-by: Christoph Hellwig Signed-off-by: Sasha Levin --- drivers/nvme/host/rdma.c | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-) diff --git a/drivers/nvme/host/rdma.c b/drivers/nvme/host/rdma.c index a68704e39084..042c594bc57e 100644 --- a/drivers/nvme/host/rdma.c +++ b/drivers/nvme/host/rdma.c @@ -656,8 +656,8 @@ static void nvme_rdma_free_queue(struct nvme_rdma_queue *queue) if (!test_and_clear_bit(NVME_RDMA_Q_ALLOCATED, &queue->flags)) return; - nvme_rdma_destroy_queue_ib(queue); rdma_destroy_id(queue->cm_id); + nvme_rdma_destroy_queue_ib(queue); mutex_destroy(&queue->queue_lock); } @@ -1815,14 +1815,10 @@ static int nvme_rdma_conn_established(struct nvme_rdma_queue *queue) for (i = 0; i < queue->queue_size; i++) { ret = nvme_rdma_post_recv(queue, &queue->rsp_ring[i]); if (ret) - goto out_destroy_queue_ib; + return ret; } return 0; - -out_destroy_queue_ib: - nvme_rdma_destroy_queue_ib(queue); - return ret; } 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) if (ret) { dev_err(ctrl->ctrl.device, "rdma_connect_locked failed (%d).\n", ret); - goto out_destroy_queue_ib; + return ret; } return 0; - -out_destroy_queue_ib: - nvme_rdma_destroy_queue_ib(queue); - return ret; } 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, case RDMA_CM_EVENT_ROUTE_ERROR: case RDMA_CM_EVENT_CONNECT_ERROR: case RDMA_CM_EVENT_UNREACHABLE: - nvme_rdma_destroy_queue_ib(queue); - fallthrough; case RDMA_CM_EVENT_ADDR_ERROR: dev_dbg(queue->ctrl->ctrl.device, "CM error event %d\n", ev->event); -- 2.33.0