Received: by 2002:a05:6a11:4021:0:0:0:0 with SMTP id ky33csp4144122pxb; Mon, 27 Sep 2021 10:16:40 -0700 (PDT) X-Google-Smtp-Source: ABdhPJz3j0JuRATyncgaFOuuxEhCbevbA1OhPtJBl5fi/JDPxJk2ZShs1BW2gjBE5hrWp2WzI+MW X-Received: by 2002:a62:1b07:0:b0:438:db92:6db0 with SMTP id b7-20020a621b07000000b00438db926db0mr1129958pfb.29.1632763000171; Mon, 27 Sep 2021 10:16:40 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1632763000; cv=none; d=google.com; s=arc-20160816; b=bgXxkSnTXKqq5sc/HLglBfHBQI1EXUXNOxEmts8kOJfNPkX5kT5s45lbOMyPYivSVs 4Pd4t8GJ6KCTwu8fNeGl2jXd+GxuC6bfMCyzK16lknaRJvTgDhs1oDtfLnm+xJdBGM9e UbviYCC/7oZ6KKVV8euP3sdzY7pI49AWSlnIfIfsyQHwlKdhhhQ4f/fvvSTHOz5O2UD0 zoNGAOMbUidmU3ZRsv9c8bcC8p+jup2EMMtHPOceUhR8Wq1L8b+Kxhki0rlHZmgl1O9C 8KtJr6pmxyNhoieKIhkwC4JYbVHDvouXHBiLVAFEFERMsDiyxUNe/PEx4gqHnbp+52dL ZL2A== 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=l2F+4RcPJNyEIYHaDcwkzyKaS0z4Q9KYxro5I7h/PjQ=; b=Ia+3qhR52TuzwNOGeHvIiTv3xgCxj+OWwoYrZ4vE3VaUaYqyWjyHE4/1PBF5Bi0rXJ xI/piwHmhEVpikA7WMJIrR1u8TrOsY1qg2nJMFIAirS3yKJ2iHxD/BXY1ziQGtre3Vra ulVC8zvLnvWEw2cf9pkvFrUAdVj0280DOMhcYp0pbkFXmpsu00uPqS6Q2heUq0RWXJak aHTzA5N2Y2Kr295FoX/BQkfArvnx416cRjtH3VNvFiUZX5e01oeTyXsZL8bXy/cp/rNV 2frFiCjW31Wc3G8LEqAeJY1DYVwfbMF/vslEg8sNn7L/NNe3xBE8y7Jmai6jHWBQBXBh S9Nw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=rMJa1tQ4; 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 k3si23144413pll.407.2021.09.27.10.16.28; Mon, 27 Sep 2021 10:16:40 -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=rMJa1tQ4; 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 S236470AbhI0RRW (ORCPT + 99 others); Mon, 27 Sep 2021 13:17:22 -0400 Received: from mail.kernel.org ([198.145.29.99]:55986 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S237211AbhI0ROS (ORCPT ); Mon, 27 Sep 2021 13:14:18 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 6CEA06120A; Mon, 27 Sep 2021 17:09:56 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1632762596; bh=r4sGwmZ+mODVLpYW1XCqU/3WO2LAP1lJhkKO6xSnhv8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=rMJa1tQ44G7LZH3IeA9DLaq6rzvckoxe/vkkNU7LIRVW5vV4OymAZnoDV6V+sQAJl 7xbKp/TLDPBNd7wbzBtg7M3Ccxv0WOWkmuselkAASO0eYg0npJYJxLmcE+0Y657pXt Ek9XEThz2EtdW08Owgp9sh3sgUPmAjXYCFIB7nY0= 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.10 083/103] nvme-rdma: destroy cm id before destroy qp to avoid use after free Date: Mon, 27 Sep 2021 19:02:55 +0200 Message-Id: <20210927170228.637910808@linuxfoundation.org> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20210927170225.702078779@linuxfoundation.org> References: <20210927170225.702078779@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 9c356be7f016..51f4647ea214 100644 --- a/drivers/nvme/host/rdma.c +++ b/drivers/nvme/host/rdma.c @@ -655,8 +655,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); } @@ -1823,14 +1823,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, @@ -1924,14 +1920,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, @@ -1962,8 +1954,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