From: "zhengbing.huang" <zhengbing.huang@easystack.cn>
To: drbd-dev@lists.linbit.com
Subject: [PATCH 3/3] rdma: Get drbd_path->kref when get drbd_path by addr
Date: Wed, 9 Jul 2025 10:55:52 +0800 [thread overview]
Message-ID: <20250709025553.694792-3-zhengbing.huang@easystack.cn> (raw)
In-Reply-To: <20250709025553.694792-1-zhengbing.huang@easystack.cn>
In the dtr_cma_accept() function, after obtain the drbd_path
through peer_addr, without take a reference,
the drbd_path may be released concurrently, leade to a use-after-free.
So when we obtain drbd_path, we add a reference count.
Signed-off-by: zhengbing.huang <zhengbing.huang@easystack.cn>
---
drbd/drbd_transport_rdma.c | 21 ++++++++++++---------
1 file changed, 12 insertions(+), 9 deletions(-)
diff --git a/drbd/drbd_transport_rdma.c b/drbd/drbd_transport_rdma.c
index 442dd8e89..68c668f7f 100644
--- a/drbd/drbd_transport_rdma.c
+++ b/drbd/drbd_transport_rdma.c
@@ -969,6 +969,8 @@ static int dtr_cma_accept(struct dtr_listener *listener, struct rdma_cm_id *new_
spin_lock(&listener->listener.waiters_lock);
drbd_path = drbd_find_path_by_addr(&listener->listener, peer_addr);
+ if (drbd_path)
+ kref_get(&drbd_path->kref);
spin_unlock(&listener->listener.waiters_lock);
if (!drbd_path) {
@@ -997,16 +999,13 @@ static int dtr_cma_accept(struct dtr_listener *listener, struct rdma_cm_id *new_
path = container_of(drbd_path, struct dtr_path, path);
cs = &path->cs;
- if (atomic_read(&cs->passive_state) < PCS_CONNECTING) {
- rdma_reject(new_cm_id, NULL, 0, IB_CM_REJ_CONSUMER_DEFINED);
- return -EAGAIN;
- }
+ if (atomic_read(&cs->passive_state) < PCS_CONNECTING)
+ goto reject;
cm = dtr_alloc_cm(path);
if (!cm) {
pr_err("rejecting connecting since -ENOMEM for cm\n");
- rdma_reject(new_cm_id, NULL, 0, IB_CM_REJ_CONSUMER_DEFINED);
- return -EAGAIN;
+ goto reject;
}
cm->state = DSM_CONNECT_REQ;
@@ -1024,17 +1023,21 @@ static int dtr_cma_accept(struct dtr_listener *listener, struct rdma_cm_id *new_
/* Gifting the initial kref to the path->cm pointer */
err = dtr_path_prepare(path, cm, false);
if (err) {
- rdma_reject(new_cm_id, NULL, 0, IB_CM_REJ_CONSUMER_DEFINED);
/* Returning the cm via ret_cm and an error causes the caller to put one ref */
-
- return -EAGAIN;
+ goto reject;
}
+ kref_put(&drbd_path->kref, drbd_destroy_path);
err = rdma_accept(new_cm_id, &dtr_conn_param);
if (err)
kref_put(&cm->kref, dtr_destroy_cm);
return err;
+
+reject:
+ rdma_reject(new_cm_id, NULL, 0, IB_CM_REJ_CONSUMER_DEFINED);
+ kref_put(&drbd_path->kref, drbd_destroy_path);
+ return -EAGAIN;
}
static int dtr_start_try_connect(struct dtr_connect_state *cs)
--
2.43.0
next prev parent reply other threads:[~2025-07-09 5:22 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-07-09 2:55 [PATCH 1/3] rdma: Fix kernel crash in dtr_create_rx_desc() zhengbing.huang
2025-07-09 2:55 ` [PATCH 2/3] drbd: Fix kernel crash in drbd_find_path_by_addr() zhengbing.huang
2025-07-31 12:36 ` Philipp Reisner
2025-07-09 2:55 ` zhengbing.huang [this message]
2025-07-31 12:36 ` [PATCH 3/3] rdma: Get drbd_path->kref when get drbd_path by addr Philipp Reisner
2025-07-31 12:35 ` [PATCH 1/3] rdma: Fix kernel crash in dtr_create_rx_desc() Philipp Reisner
2025-08-01 2:59 ` ZhengbingHuang
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20250709025553.694792-3-zhengbing.huang@easystack.cn \
--to=zhengbing.huang@easystack.cn \
--cc=drbd-dev@lists.linbit.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox