Bluetooth: RFCOMM: serialize session teardown
Subsystems (2)
PATCH v2 1/1 Bluetooth: RFCOMM: serialize session teardown
rfcomm_kill_listener() walks session_list and deletes every session without holding rfcomm_mutex, unlike the normal session processing and connect error paths.
Under normal operation, an open RFCOMM socket pins rfcomm.ko, so rfcomm_kill_listener() does not run concurrently with rfcomm_dlc_open(). However, forced module unload via delete_module(O_TRUNC) can stop krfcommd while a failed connect is still unwinding.
connect task forced unload / krfcommd
------------ ------------------------
rfcomm_lock()
rfcomm_session_add()
delete_module("rfcomm", O_TRUNC) rfcomm_kill_listener()
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 with mdelay() to enlarge critical window:
BUG: KASAN: slab-use-after-free in rfcomm_run+0x3802/0x3f00 [rfcomm] Read of size 8 at addr ffff888111058d40 by task krfcommd/79 Tainted: [R]=FORCED_RMMOD Allocated by task 86: rfcomm_session_add+0xa1/0x300 [rfcomm] rfcomm_dlc_open+0x8b2/0xf30 [rfcomm] rfcomm_sock_connect+0x34c/0x530 [rfcomm] Freed by task 86: kfree+0x121/0x3c0 rfcomm_dlc_open+0xab7/0xf30 [rfcomm] rfcomm_sock_connect+0x34c/0x530 [rfcomm]
Hold rfcomm_mutex across the teardown traversal so every reachable session_list walk uses the same serialization.
---
Changes in v2:
- Rewrite the changelog to describe make clear trigger: forced module unload with delete_module(O_TRUNC) and temporary delay widening.
- Drop the Fixes tag.
- Drop Cc: stable.
- Add Ali Ahmet Memis's Reviewed-by and Tested-by tags.
- Add Pauli Virtanen's Reviewed-by tag.
net/bluetooth/rfcomm/core.c | 2 ++ 1 file changed, 2 insertions(+)
net/bluetooth/rfcomm/core.c +2 -0
@@ -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)
Signature · 1 line
2.43.0
This is automated email and please do not reply to this email!
Dear submitter,
Thank you for submitting the patches to the linux bluetooth mailing list. This is a CI test results with your patch series:
PW Link:https://patchwork.kernel.org/project/bluetooth/list/?series=1150209
---Test result---
Test Summary:
CheckPatch FAIL 0.50 seconds VerifyFixes PASS 0.10 seconds VerifySignedoff PASS 0.10 seconds GitLint PASS 0.24 seconds SubjectPrefix PASS 0.10 seconds BuildKernel PASS 19.49 seconds CheckAllWarning PASS 20.25 seconds CheckSparse PASS 20.09 seconds BuildKernel32 PASS 17.78 seconds CheckKernelLLVM SKIP 0.00 seconds TestRunnerSetup PASS 312.51 seconds TestRunner_rfcomm-tester PASS 18.63 seconds IncrementalBuild PASS 18.67 seconds
Details
##############################
Test: CheckPatch - FAIL
Desc: Run checkpatch.pl script
Output:
[v2] Bluetooth: RFCOMM: serialize session teardown
WARNING: The commit message has 'BUG: KASAN: ', perhaps it also needs a 'Fixes:' tag?
total: 0 errors, 1 warnings, 0 checks, 10 lines checked
NOTE: For some of the reported defects, checkpatch may be able to
mechanically convert to the typical style using --fix or --fix-inplace.
/github/workspace/src/patch/14763029.patch has style problems, please review.
NOTE: Ignored message types: UNKNOWN_COMMIT_ID
NOTE: If any of the errors are false positives, please report
them to the maintainer, see CHECKPATCH in MAINTAINERS.
##############################
Test: CheckKernelLLVM - SKIP
Desc: Build kernel with LLVM + context analysis
Output:
Clang not found
https://github.com/bluez/bluetooth-next/pull/635
---
Regards,
Linux Bluetooth
This patch was applied to bluetooth/bluetooth-next.git (master) by Luiz Augusto von Dentz <[email protected]>:
Hello:
This patch was applied to bluetooth/bluetooth-next.git (master) by Luiz Augusto von Dentz <[email protected]>:
Quoted 10 lines · On Sat, 22 Aug 2026 23:06:19 +0800 you wrote:
rfcomm_kill_listener()walkssession_listand deletes every session without holdingrfcomm_mutex, unlike the normal session processing and connect error paths.Under normal operation, an open RFCOMM socket pins rfcomm.ko, so
rfcomm_kill_listener()does not run concurrently withrfcomm_dlc_open(). However, forced module unload viadelete_module(O_TRUNC)can stop krfcommd while a failed connect is still unwinding.[...]
Here is the summary with links:
- [v2] Bluetooth: RFCOMM: serialize session teardown
https://git.kernel.org/bluetooth/bluetooth-next/c/fe3897b4ab57
You are awesome, thank you!
Signature · 2 lines
Deet-doot-dot, I am a bot. https://korg.docs.kernel.org/patchwork/pwbot.html