]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
Bluetooth: hci_sync: fix race in hci_cmd_sync_dequeue_once
authorCen Zhang <zzzccc427@163.com>
Mon, 29 Sep 2025 05:30:17 +0000 (05:30 +0000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 13 Nov 2025 20:33:58 +0000 (15:33 -0500)
[ Upstream commit 09b0cd1297b4dbfe736aeaa0ceeab2265f47f772 ]

hci_cmd_sync_dequeue_once() does lookup and then cancel
the entry under two separate lock sections. Meanwhile,
hci_cmd_sync_work() can also delete the same entry,
leading to double list_del() and "UAF".

Fix this by holding cmd_sync_work_lock across both
lookup and cancel, so that the entry cannot be removed
concurrently.

Fixes: 505ea2b29592 ("Bluetooth: hci_sync: Add helper functions to manipulate cmd_sync queue")
Reported-by: Cen Zhang <zzzccc427@163.com>
Signed-off-by: Cen Zhang <zzzccc427@163.com>
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
net/bluetooth/hci_sync.c

index 853acfa8e9433a1ea7121fdb0fdb7bc67e25f98c..c08e46ee70b24b6058d00f3ad89b69159e47e666 100644 (file)
@@ -863,11 +863,17 @@ bool hci_cmd_sync_dequeue_once(struct hci_dev *hdev,
 {
        struct hci_cmd_sync_work_entry *entry;
 
-       entry = hci_cmd_sync_lookup_entry(hdev, func, data, destroy);
-       if (!entry)
+       mutex_lock(&hdev->cmd_sync_work_lock);
+
+       entry = _hci_cmd_sync_lookup_entry(hdev, func, data, destroy);
+       if (!entry) {
+               mutex_unlock(&hdev->cmd_sync_work_lock);
                return false;
+       }
 
-       hci_cmd_sync_cancel_entry(hdev, entry);
+       _hci_cmd_sync_cancel_entry(hdev, entry, -ECANCELED);
+
+       mutex_unlock(&hdev->cmd_sync_work_lock);
 
        return true;
 }