Skip to content

Commit a367964

Browse files
Vudentzholtmann
authored andcommitted
Bluetooth: HCI: Use skb_pull_data to parse LE Direct Advertising Report event
This uses skb_pull_data to check the LE Direct Advertising Report events received have the minimum required length. Signed-off-by: Luiz Augusto von Dentz <[email protected]> Signed-off-by: Marcel Holtmann <[email protected]>
1 parent b48b833 commit a367964

File tree

2 files changed

+25
-8
lines changed

2 files changed

+25
-8
lines changed

include/net/bluetooth/hci.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2500,14 +2500,19 @@ struct hci_ev_le_data_len_change {
25002500

25012501
#define HCI_EV_LE_DIRECT_ADV_REPORT 0x0B
25022502
struct hci_ev_le_direct_adv_info {
2503-
__u8 evt_type;
2503+
__u8 type;
25042504
__u8 bdaddr_type;
25052505
bdaddr_t bdaddr;
25062506
__u8 direct_addr_type;
25072507
bdaddr_t direct_addr;
25082508
__s8 rssi;
25092509
} __packed;
25102510

2511+
struct hci_ev_le_direct_adv_report {
2512+
__u8 num;
2513+
struct hci_ev_le_direct_adv_info info[];
2514+
} __packed;
2515+
25112516
#define HCI_EV_LE_PHY_UPDATE_COMPLETE 0x0c
25122517
struct hci_ev_le_phy_update_complete {
25132518
__u8 status;

net/bluetooth/hci_event.c

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6881,19 +6881,31 @@ static void hci_le_remote_conn_param_req_evt(struct hci_dev *hdev,
68816881
static void hci_le_direct_adv_report_evt(struct hci_dev *hdev,
68826882
struct sk_buff *skb)
68836883
{
6884-
u8 num_reports = skb->data[0];
6885-
struct hci_ev_le_direct_adv_info *ev = (void *)&skb->data[1];
6884+
struct hci_ev_le_direct_adv_report *ev;
6885+
int i;
6886+
6887+
ev = hci_le_ev_skb_pull(hdev, skb, HCI_EV_LE_DIRECT_ADV_REPORT,
6888+
sizeof(*ev));
6889+
if (!ev)
6890+
return;
68866891

6887-
if (!num_reports || skb->len < num_reports * sizeof(*ev) + 1)
6892+
if (!hci_le_ev_skb_pull(hdev, skb, HCI_EV_LE_DIRECT_ADV_REPORT,
6893+
flex_array_size(ev, info, ev->num)))
6894+
return;
6895+
6896+
if (!ev->num)
68886897
return;
68896898

68906899
hci_dev_lock(hdev);
68916900

6892-
for (; num_reports; num_reports--, ev++)
6893-
process_adv_report(hdev, ev->evt_type, &ev->bdaddr,
6894-
ev->bdaddr_type, &ev->direct_addr,
6895-
ev->direct_addr_type, ev->rssi, NULL, 0,
6901+
for (i = 0; i < ev->num; i++) {
6902+
struct hci_ev_le_direct_adv_info *info = &ev->info[i];
6903+
6904+
process_adv_report(hdev, info->type, &info->bdaddr,
6905+
info->bdaddr_type, &info->direct_addr,
6906+
info->direct_addr_type, info->rssi, NULL, 0,
68966907
false);
6908+
}
68976909

68986910
hci_dev_unlock(hdev);
68996911
}

0 commit comments

Comments
 (0)