From: hkbinbin <hkbinbinbin@gmail.com>
To: marcel@holtmann.org, luiz.dentz@gmail.com
Cc: gregkh@linuxfoundation.org, linux-bluetooth@vger.kernel.org,
linux-kernel@vger.kernel.org, stable@vger.kernel.org,
hkbinbin <hkbinbinbin@gmail.com>
Subject: [PATCH v2] Bluetooth: hci_event: fix OOB read in hci_le_create_big_complete_evt
Date: Tue, 31 Mar 2026 14:13:32 +0000 [thread overview]
Message-ID: <20260331141332.3243059-1-hkbinbinbin@gmail.com> (raw)
In-Reply-To: <20260331055032.1883139-1-hkbinbinbin@gmail.com>
hci_le_create_big_complete_evt() iterates over BT_BOUND connections for
a BIG handle using a while loop, accessing ev->bis_handle[i++] on each
iteration. However, there is no check that i stays within ev->num_bis
before the array access.
When a controller sends a LE_Create_BIG_Complete event with fewer
bis_handle entries than there are BT_BOUND connections for that BIG,
or with num_bis=0, the loop reads beyond the valid bis_handle[] flex
array into adjacent heap memory. Since the out-of-bounds values
typically exceed HCI_CONN_HANDLE_MAX (0x0EFF), hci_conn_set_handle()
rejects them and the connection remains in BT_BOUND state. The same
connection is then found again by hci_conn_hash_lookup_big_state(),
creating an infinite loop with hci_dev_lock held.
Fix this by:
- Breaking out of the loop when i reaches ev->num_bis and cleaning
up all remaining BT_BOUND connections, then terminating the BIG
since a mismatch between the host and controller state indicates
failure.
- Properly cleaning up the connection when hci_conn_set_handle()
fails, instead of calling continue which leaves it in BT_BOUND
state where it would be found again by the same lookup on the
next iteration.
Fixes: a0bfde167b50 ("Bluetooth: ISO: Add support for connecting multiple BISes")
Cc: stable@vger.kernel.org
Signed-off-by: hkbinbin <hkbinbinbin@gmail.com>
---
net/bluetooth/hci_event.c | 26 ++++++++++++++++++++++++--
1 file changed, 24 insertions(+), 2 deletions(-)
diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c
index 286529d2e554..64b5b497c491 100644
--- a/net/bluetooth/hci_event.c
+++ b/net/bluetooth/hci_event.c
@@ -7085,9 +7085,15 @@ static void hci_le_create_big_complete_evt(struct hci_dev *hdev, void *data,
continue;
}
+ if (i >= ev->num_bis)
+ break;
+
if (hci_conn_set_handle(conn,
- __le16_to_cpu(ev->bis_handle[i++])))
+ __le16_to_cpu(ev->bis_handle[i++]))) {
+ hci_connect_cfm(conn, HCI_ERROR_UNSPECIFIED);
+ hci_conn_del(conn);
continue;
+ }
conn->state = BT_CONNECTED;
set_bit(HCI_CONN_BIG_CREATED, &conn->flags);
@@ -7096,7 +7102,22 @@ static void hci_le_create_big_complete_evt(struct hci_dev *hdev, void *data,
hci_iso_setup_path(conn);
}
- if (!ev->status && !i)
+ if (conn) {
+ /* More bound connections than BIS handles reported by the
+ * controller -- treat this as a failure for the entire BIG
+ * and clean up any remaining BT_BOUND connections.
+ */
+ do {
+ hci_connect_cfm(conn, HCI_ERROR_UNSPECIFIED);
+ hci_conn_del(conn);
+ } while ((conn = hci_conn_hash_lookup_big_state(hdev,
+ ev->handle,
+ BT_BOUND,
+ HCI_ROLE_MASTER)));
+
+ hci_cmd_sync_queue(hdev, hci_iso_term_big_sync,
+ UINT_PTR(ev->handle), NULL);
+ } else if (!ev->status && !i) {
/* If no BISes have been connected for the BIG,
* terminate. This is in case all bound connections
* have been closed before the BIG creation
@@ -7104,6 +7125,7 @@ static void hci_le_create_big_complete_evt(struct hci_dev *hdev, void *data,
*/
hci_cmd_sync_queue(hdev, hci_iso_term_big_sync,
UINT_PTR(ev->handle), NULL);
+ }
hci_dev_unlock(hdev);
}
--
2.51.0
next prev parent reply other threads:[~2026-03-31 14:13 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-03-31 5:50 [PATCH] Bluetooth: hci_event: fix OOB read and infinite loop in hci_le_create_big_complete_evt hkbinbin
2026-03-31 6:37 ` bluez.test.bot
2026-03-31 13:36 ` [PATCH] " Luiz Augusto von Dentz
2026-03-31 14:13 ` hkbinbin [this message]
2026-03-31 14:13 ` [PATCH v2] Bluetooth: hci_event: fix OOB read " hkbinbin
2026-03-31 15:22 ` [v2] " bluez.test.bot
2026-04-09 20:21 ` bluez.test.bot
2026-04-09 20:21 ` Bluetooth: hci_event: fix OOB read and infinite loop " bluez.test.bot
2026-04-10 16:19 ` [PATCH v2] " hkbinbin
2026-04-10 16:54 ` [v2] " bluez.test.bot
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=20260331141332.3243059-1-hkbinbinbin@gmail.com \
--to=hkbinbinbin@gmail.com \
--cc=gregkh@linuxfoundation.org \
--cc=linux-bluetooth@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=luiz.dentz@gmail.com \
--cc=marcel@holtmann.org \
--cc=stable@vger.kernel.org \
/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.