--- a/net/bluetooth/hci_event.c +++ b/net/bluetooth/hci_event.c @@ -5685,10 +5685,14 @@ static void hci_le_ext_adv_report_evt(struct hci_dev *hdev, struct sk_buff *skb) { u8 num_reports = skb->data[0]; void *ptr = &skb->data[1]; + u32 len_processed = 0; hci_dev_lock(hdev); while (num_reports--) { + if (len_processed > skb->len) + break; + struct hci_ev_le_ext_adv_report *ev = ptr; u8 legacy_evt_type; u16 evt_type; @@ -5703,6 +5707,7 @@ static void hci_le_ext_adv_report_evt(struct hci_dev *hdev, struct sk_buff *skb) } ptr += sizeof(*ev) + ev->length; + len_processed += sizeof(*ev) + ev->length; } hci_dev_unlock(hdev);