@@ -1133,6 +1133,9 @@ static void store_pending_adv_report(struct hci_dev *hdev, bdaddr_t *bdaddr,
1133
1133
{
1134
1134
struct discovery_state * d = & hdev -> discovery ;
1135
1135
1136
+ if (len > HCI_MAX_AD_LENGTH )
1137
+ return ;
1138
+
1136
1139
bacpy (& d -> last_adv_addr , bdaddr );
1137
1140
d -> last_adv_addr_type = bdaddr_type ;
1138
1141
d -> last_adv_rssi = rssi ;
@@ -4779,6 +4782,11 @@ static void process_adv_report(struct hci_dev *hdev, u8 type, bdaddr_t *bdaddr,
4779
4782
return ;
4780
4783
}
4781
4784
4785
+ if (len > HCI_MAX_AD_LENGTH ) {
4786
+ pr_err_ratelimited ("legacy adv larger than 31 bytes" );
4787
+ return ;
4788
+ }
4789
+
4782
4790
/* Find the end of the data in case the report contains padded zero
4783
4791
* bytes at the end causing an invalid length value.
4784
4792
*
@@ -4839,7 +4847,7 @@ static void process_adv_report(struct hci_dev *hdev, u8 type, bdaddr_t *bdaddr,
4839
4847
*/
4840
4848
conn = check_pending_le_conn (hdev , bdaddr , bdaddr_type , type ,
4841
4849
direct_addr );
4842
- if (conn && type == LE_ADV_IND ) {
4850
+ if (conn && type == LE_ADV_IND && len <= HCI_MAX_AD_LENGTH ) {
4843
4851
/* Store report for later inclusion by
4844
4852
* mgmt_device_connected
4845
4853
*/
@@ -4964,10 +4972,14 @@ static void hci_le_adv_report_evt(struct hci_dev *hdev, struct sk_buff *skb)
4964
4972
struct hci_ev_le_advertising_info * ev = ptr ;
4965
4973
s8 rssi ;
4966
4974
4967
- rssi = ev -> data [ev -> length ];
4968
- process_adv_report (hdev , ev -> evt_type , & ev -> bdaddr ,
4969
- ev -> bdaddr_type , NULL , 0 , rssi ,
4970
- ev -> data , ev -> length );
4975
+ if (ev -> length <= HCI_MAX_AD_LENGTH ) {
4976
+ rssi = ev -> data [ev -> length ];
4977
+ process_adv_report (hdev , ev -> evt_type , & ev -> bdaddr ,
4978
+ ev -> bdaddr_type , NULL , 0 , rssi ,
4979
+ ev -> data , ev -> length );
4980
+ } else {
4981
+ bt_dev_err (hdev , "Dropping invalid advertising data" );
4982
+ }
4971
4983
4972
4984
ptr += sizeof (* ev ) + ev -> length + 1 ;
4973
4985
}
0 commit comments