Bluetooth: hci_core: Serialize fragmented ISO packet queueing
Subsystems (3)
PATCH 1/1 Bluetooth: hci_core: Serialize fragmented ISO packet queueing
The fragmented path in hci_queue_iso() calls __skb_queue_tail() without holding conn->data_q.lock. The socket lock serializes senders, but the transmit worker can concurrently remove packets from this queue using skb_dequeue().
After an insertion saves the old tail pointer, hci_sched_iso() can dequeue that packet and pass it to the driver. The driver can free the packet before the insertion resumes and writes to the old tail's next pointer, causing a use-after-free. Concurrent updates can also corrupt the queue.
KASAN reported:
BUG: KASAN: slab-use-after-free in hci_send_iso+0xc7d/0xe10 Call Trace: hci_send_iso+0xc7d/0xe10 iso_sock_sendmsg+0x710/0x900 __sys_sendto+0x34a/0x3a0 Allocated by task 86: __alloc_skb+0xdd/0x820 alloc_skb_with_frags+0x7e/0x770 sock_alloc_send_pskb+0x67a/0x820 bt_skb_sendmsg.constprop.0+0xc0/0x6c0 iso_sock_sendmsg+0x44e/0x900 Freed by task 90: kmem_cache_free+0xcb/0x3d0 vhci_read+0x33f/0x4d0 vfs_read+0x177/0xa20
Hold the queue lock across the entire fragment batch, as hci_queue_acl() does, to serialize insertion against dequeue while preserving fragment ordering.
--- net/bluetooth/hci_core.c | 4 ++++ 1 file changed, 4 insertions(+)
net/bluetooth/hci_core.c +4 -0
@@ -3325,6 +3325,8 @@ static void hci_queue_iso(struct hci_conn *conn, struct sk_buff_head *queue,skb_shinfo (skb)->frag_list =NULL ; +spin_lock_bh (&queue->lock); +__skb_queue_tail (queue, skb); do {
@@ -3339,6 +3341,8 @@ static void hci_queue_iso(struct hci_conn *conn, struct sk_buff_head *queue,__skb_queue_tail (queue, skb); }while (list); + +spin_unlock_bh (&queue->lock); }bt_dev_dbg (hdev,"hcon %p queued %d" , conn,skb_queue_len (queue));
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/series/1174572/
---Test result---
Test Summary:
CheckPatch PASS 0.77 seconds VerifyFixes PASS 0.14 seconds VerifySignedoff PASS 0.13 seconds GitLint PASS 0.35 seconds SubjectPrefix PASS 0.13 seconds BuildKernel PASS 30.02 seconds CheckAllWarning PASS 33.78 seconds CheckSparse PASS 35.76 seconds BuildKernel32 PASS 28.90 seconds CheckKernelLLVM PASS 32.81 seconds TestRunnerSetup PASS 790.39 seconds TestRunner_l2cap-tester PASS 16.60 seconds TestRunner_iso-tester PASS 30.86 seconds TestRunner_bnep-tester PASS 3.14 seconds TestRunner_mgmt-tester PASS 61.02 seconds TestRunner_rfcomm-tester PASS 4.49 seconds TestRunner_sco-tester PASS 7.64 seconds TestRunner_ioctl-tester PASS 4.66 seconds TestRunner_mesh-tester FAIL 7.85 seconds TestRunner_smp-tester PASS 4.32 seconds TestRunner_userchan-tester PASS 3.22 seconds TestRunner_6lowpan-tester PASS 4.39 seconds IncrementalBuild PASS 27.08 seconds
Details
##############################
Test: TestRunner_mesh-tester - FAIL
Desc: Run mesh-tester with test-runner Output:
Total: 10, Passed: 8 (80.0%), Failed: 2, Not Run: 0
Failed Test Cases
Mesh - Send cancel - 1 Timed out 2.422 seconds Mesh - Send cancel - 2 Timed out 1.999 seconds
https://github.com/bluez/bluetooth-next/pull/826
---
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 11 lines · On Sun, 27 Sep 2026 01:29:35 +0800 you wrote:
The fragmented path in
hci_queue_iso()calls__skb_queue_tail()without holdingconn->data_q.lock. The socket lock serializes senders, but the transmit worker can concurrently remove packets from this queue usingskb_dequeue().After an insertion saves the old tail pointer,
hci_sched_iso()can dequeue that packet and pass it to the driver. The driver can free the packet before the insertion resumes and writes to the old tail's next pointer, causing a use-after-free. Concurrent updates can also corrupt the queue.[...]
Here is the summary with links:
- Bluetooth: hci_core: Serialize fragmented ISO packet queueing
https://git.kernel.org/bluetooth/bluetooth-next/c/1a572db43c05
You are awesome, thank you!
Signature · 2 lines
Deet-doot-dot, I am a bot. https://korg.docs.kernel.org/patchwork/pwbot.html