From: Chengfeng Ye <nicoyip.dev@gmail.com>
To: Marcel Holtmann <marcel@holtmann.org>,
Luiz Augusto von Dentz <luiz.dentz@gmail.com>,
Kees Cook <kees@kernel.org>, Chengfeng Ye <nicoyip.dev@gmail.com>,
Jakub Kicinski <kuba@kernel.org>,
Pengpeng Hou <pengpeng@iscas.ac.cn>,
Jiale Yao <yaojiale02@163.com>,
SeungJu Cheon <suunj1331@gmail.com>,
Ali Ahmet Memis <ali@iusegentoo.com>,
Tim Bird <tim.bird@sony.com>
Cc: linux-bluetooth@vger.kernel.org, linux-kernel@vger.kernel.org,
stable@vger.kernel.org
Subject: [PATCH] Bluetooth: RFCOMM: serialize session teardown
Date: Sat, 22 Aug 2026 01:45:14 +0800 [thread overview]
Message-ID: <20260821174514.3034851-1-nicoyip.dev@gmail.com> (raw)
rfcomm_kill_listener() walks session_list and deletes every session
without holding rfcomm_mutex. A connect task holds that mutex while
rfcomm_session_create() adds a session and while its error path deletes
the session, but the unlocked teardown can still observe the object
between those operations.
The race can proceed as follows:
connect task krfcommd
------------ --------
rfcomm_lock()
rfcomm_session_add()
fetch session from session_list
kernel_connect() fails
rfcomm_session_del()
remove and free session
rfcomm_session_del(session)
The final call then reads the freed session and may corrupt the list.
KASAN reported:
BUG: KASAN: slab-use-after-free in rfcomm_session_del+0x15f/0x170
Read of size 8 at addr ffff8881019e9b40 by task krfcommd/87
Call Trace:
rfcomm_session_del+0x15f/0x170
rfcomm_run+0x16d5/0x3de0
kthread+0x2c6/0x3b0
ret_from_fork+0x36e/0x5a0
Allocated by task 96:
rfcomm_session_add+0x9e/0x300
rfcomm_dlc_open+0x8b1/0xdf0
rfcomm_sock_connect+0x34c/0x530
Freed by task 96:
kfree+0x131/0x3c0
rfcomm_session_del+0x109/0x170
rfcomm_dlc_open+0x9eb/0xdf0
rfcomm_sock_connect+0x34c/0x530
Hold rfcomm_mutex across the teardown traversal, matching the locking
used by normal session processing and connect error cleanup.
Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
Cc: stable@vger.kernel.org
Signed-off-by: Chengfeng Ye <nicoyip.dev@gmail.com>
---
net/bluetooth/rfcomm/core.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/net/bluetooth/rfcomm/core.c b/net/bluetooth/rfcomm/core.c
index 9cdfea666a2c..5fe2758e8c47 100644
--- a/net/bluetooth/rfcomm/core.c
+++ b/net/bluetooth/rfcomm/core.c
@@ -2178,8 +2178,10 @@ static void rfcomm_kill_listener(void)
BT_DBG("");
+ rfcomm_lock();
list_for_each_entry_safe(s, n, &session_list, list)
rfcomm_session_del(s);
+ rfcomm_unlock();
}
static int rfcomm_run(void *unused)
--
2.43.0
next reply other threads:[~2026-08-21 17:45 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-21 17:45 Chengfeng Ye [this message]
2026-08-21 18:29 ` Bluetooth: RFCOMM: serialize session teardown bluez.test.bot
2026-08-21 19:21 ` [PATCH] " Ali Ahmet Memis
2026-08-22 7:14 ` Chengfeng Ye
2026-08-22 8:30 ` Ali Ahmet Memis
2026-08-22 15:16 ` Chengfeng Ye
2026-08-22 8:22 ` Pauli Virtanen
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=20260821174514.3034851-1-nicoyip.dev@gmail.com \
--to=nicoyip.dev@gmail.com \
--cc=ali@iusegentoo.com \
--cc=kees@kernel.org \
--cc=kuba@kernel.org \
--cc=linux-bluetooth@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=luiz.dentz@gmail.com \
--cc=marcel@holtmann.org \
--cc=pengpeng@iscas.ac.cn \
--cc=stable@vger.kernel.org \
--cc=suunj1331@gmail.com \
--cc=tim.bird@sony.com \
--cc=yaojiale02@163.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.