diff --git a/system/stack/btu/btu_hcif.cc b/system/stack/btu/btu_hcif.cc index 33bffa3a6b0b6619d5bf6cd4f93af2bfc7d78bdd..5b985936439f85bee3294a2ddde31307e6869e6d 100644 --- a/system/stack/btu/btu_hcif.cc +++ b/system/stack/btu/btu_hcif.cc @@ -96,7 +96,7 @@ static void btu_ble_ll_conn_param_upd_evt(uint8_t* p, uint16_t evt_len); static void btu_ble_proc_ltk_req(uint8_t* p); static void btu_hcif_encryption_key_refresh_cmpl_evt(uint8_t* p); static void btu_ble_data_length_change_evt(uint8_t* p, uint16_t evt_len); -static void btu_ble_rc_param_req_evt(uint8_t* p); +static void btu_ble_rc_param_req_evt(uint8_t* p, uint8_t len); /** * Log HCI event metrics that are not handled in special functions @@ -352,7 +352,7 @@ void btu_hcif_process_event(UNUSED_ATTR uint8_t controller_id, btu_ble_proc_ltk_req(p); break; case HCI_BLE_RC_PARAM_REQ_EVT: - btu_ble_rc_param_req_evt(p); + btu_ble_rc_param_req_evt(p, ble_evt_len); break; case HCI_BLE_DATA_LENGTH_CHANGE_EVT: btu_ble_data_length_change_evt(p, hci_evt_len); @@ -1696,10 +1696,15 @@ static void btu_ble_data_length_change_evt(uint8_t* p, uint16_t evt_len) { /********************************************** * End of BLE Events Handler **********************************************/ -static void btu_ble_rc_param_req_evt(uint8_t* p) { +static void btu_ble_rc_param_req_evt(uint8_t* p, uint8_t len) { uint16_t handle; uint16_t int_min, int_max, latency, timeout; + if (len < 10) { + LOG(ERROR) << __func__ << "bogus event packet, too short"; + return; + } + STREAM_TO_UINT16(handle, p); STREAM_TO_UINT16(int_min, p); STREAM_TO_UINT16(int_max, p);