]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
Bluetooth: hci_sync: reject oversized Broadcast Announcement prepend
authorYuqi Xu <xuyq21@lenovo.com>
Fri, 29 May 2026 08:54:23 +0000 (16:54 +0800)
committerLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
Wed, 3 Jun 2026 15:21:48 +0000 (11:21 -0400)
Existing advertising instances can already hold the maximum extended
advertising payload. When hci_adv_bcast_annoucement() prepends the
Broadcast Announcement service data to that payload, the combined data
may no longer fit in the temporary buffer used to rebuild the
advertising data.

Reject that case before copying the existing payload and report the
failure through the device log. This keeps the existing advertising
data intact and avoids overrunning the temporary buffer.

Fixes: 5725bc608252 ("Bluetooth: hci_sync: Fix broadcast/PA when using an existing instance")
Cc: stable@kernel.org
Reported-by: Yuan Tan <yuantan098@gmail.com>
Reported-by: Zhengchuan Liang <zcliangcn@gmail.com>
Reported-by: Xin Liu <bird@lzu.edu.cn>
Assisted-by: Codex:GPT-5.4
Signed-off-by: Yuqi Xu <xuyq21@lenovo.com>
Signed-off-by: Ren Wei <n05ec@lzu.edu.cn>
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
net/bluetooth/hci_sync.c

index aeccd8084cba751004725d81a85dfd2039059447..df23245d6ccdaf64f1cdf26043359cd851517c37 100644 (file)
@@ -1725,6 +1725,11 @@ static int hci_adv_bcast_annoucement(struct hci_dev *hdev, struct adv_info *adv)
        /* Generate Broadcast ID */
        get_random_bytes(bid, sizeof(bid));
        len = eir_append_service_data(ad, 0, 0x1852, bid, sizeof(bid));
+       if (adv->adv_data_len > sizeof(ad) - len) {
+               bt_dev_err(hdev, "No room for Broadcast Announcement");
+               return -EINVAL;
+       }
+
        memcpy(ad + len, adv->adv_data, adv->adv_data_len);
        hci_set_adv_instance_data(hdev, adv->instance, len + adv->adv_data_len,
                                  ad, 0, NULL);