mirror of
https://github.com/espressif/esp-idf.git
synced 2026-10-02 11:10:54 +03:00
fix(ble/bluedroid): fix direct-connect cleanup and adv bounds
This commit is contained in:
@@ -859,6 +859,35 @@ void btm_ble_enqueue_direct_conn_req(void *p_param)
|
|||||||
}
|
}
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
**
|
**
|
||||||
|
** Function btm_ble_remove_direct_conn_req
|
||||||
|
**
|
||||||
|
** Description Remove a pending direct connection request for the given LCB.
|
||||||
|
**
|
||||||
|
** Returns None.
|
||||||
|
**
|
||||||
|
*******************************************************************************/
|
||||||
|
void btm_ble_remove_direct_conn_req(void *p_param)
|
||||||
|
{
|
||||||
|
fixed_queue_t *q = btm_cb.ble_ctr_cb.conn_pending_q;
|
||||||
|
|
||||||
|
if (q == NULL || p_param == NULL) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
list_t *list = fixed_queue_get_list(q);
|
||||||
|
for (const list_node_t *node = list_begin(list); node != NULL; node = list_next(node)) {
|
||||||
|
tBTM_BLE_CONN_REQ *p = (tBTM_BLE_CONN_REQ *)list_node(node);
|
||||||
|
|
||||||
|
if (p->p_param == p_param) {
|
||||||
|
if (fixed_queue_try_remove_from_queue(q, p) != NULL) {
|
||||||
|
osi_free(p);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*******************************************************************************
|
||||||
|
**
|
||||||
** Function btm_send_pending_direct_conn
|
** Function btm_send_pending_direct_conn
|
||||||
**
|
**
|
||||||
** Description This function send the pending direct connection request in queue
|
** Description This function send the pending direct connection request in queue
|
||||||
@@ -873,7 +902,17 @@ BOOLEAN btm_send_pending_direct_conn(void)
|
|||||||
|
|
||||||
p_req = (tBTM_BLE_CONN_REQ*)fixed_queue_dequeue(btm_cb.ble_ctr_cb.conn_pending_q, 0);
|
p_req = (tBTM_BLE_CONN_REQ*)fixed_queue_dequeue(btm_cb.ble_ctr_cb.conn_pending_q, 0);
|
||||||
if (p_req != NULL) {
|
if (p_req != NULL) {
|
||||||
rt = l2cble_init_direct_conn((tL2C_LCB *)(p_req->p_param));
|
tL2C_LCB *p_lcb = (tL2C_LCB *)(p_req->p_param);
|
||||||
|
|
||||||
|
if (p_lcb == NULL || !p_lcb->in_use) {
|
||||||
|
osi_free((void *)p_req);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
rt = l2cble_init_direct_conn(p_lcb);
|
||||||
|
if (!rt) {
|
||||||
|
l2cu_release_lcb(p_lcb);
|
||||||
|
}
|
||||||
|
|
||||||
osi_free((void *)p_req);
|
osi_free((void *)p_req);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1841,7 +1841,7 @@ UINT8 *btm_ble_build_adv_data(tBTM_BLE_AD_MASK *p_data_mask, UINT8 **p_dst,
|
|||||||
if (len > MIN_ADV_LENGTH && data_mask & BTM_BLE_AD_BIT_SERVICE_DATA &&
|
if (len > MIN_ADV_LENGTH && data_mask & BTM_BLE_AD_BIT_SERVICE_DATA &&
|
||||||
p_data && p_data->p_service_data && p_data->p_service_data->len != 0 && p_data->p_service_data->p_val) {
|
p_data && p_data->p_service_data && p_data->p_service_data->len != 0 && p_data->p_service_data->p_val) {
|
||||||
if (len > (p_data->p_service_data->service_uuid.len + MIN_ADV_LENGTH)) {
|
if (len > (p_data->p_service_data->service_uuid.len + MIN_ADV_LENGTH)) {
|
||||||
if (p_data->p_service_data->len > (len - MIN_ADV_LENGTH)) {
|
if (p_data->p_service_data->len > (len - MIN_ADV_LENGTH - p_data->p_service_data->service_uuid.len)) {
|
||||||
cp_len = len - MIN_ADV_LENGTH - p_data->p_service_data->service_uuid.len;
|
cp_len = len - MIN_ADV_LENGTH - p_data->p_service_data->service_uuid.len;
|
||||||
} else {
|
} else {
|
||||||
cp_len = p_data->p_service_data->len;
|
cp_len = p_data->p_service_data->len;
|
||||||
@@ -2895,6 +2895,9 @@ void btm_send_sel_conn_callback(BD_ADDR remote_bda, UINT8 evt_type, UINT8 *p_dat
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (p_dev_name) {
|
if (p_dev_name) {
|
||||||
|
if (len > sizeof(remname) - 1) {
|
||||||
|
len = sizeof(remname) - 1;
|
||||||
|
}
|
||||||
memcpy(remname, p_dev_name, len);
|
memcpy(remname, p_dev_name, len);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -3018,6 +3021,10 @@ void btm_ble_process_adv_pkt (UINT8 *p_data, UINT8 evt_len)
|
|||||||
#endif
|
#endif
|
||||||
/* Validate data_len before any path (callee reads 1 + data_len + 1 = data_len+2 bytes from p) */
|
/* Validate data_len before any path (callee reads 1 + data_len + 1 = data_len+2 bytes from p) */
|
||||||
data_len = *p; /* read without advancing; p points to data_len byte */
|
data_len = *p; /* read without advancing; p points to data_len byte */
|
||||||
|
if (data_len > BTM_BLE_ADV_DATA_LEN_MAX) {
|
||||||
|
BTM_TRACE_ERROR("btm_ble_process_adv_pkt: legacy adv data_len %u exceeds max %u", data_len, BTM_BLE_ADV_DATA_LEN_MAX);
|
||||||
|
break;
|
||||||
|
}
|
||||||
if (data_len + 2 > remaining - 8) {
|
if (data_len + 2 > remaining - 8) {
|
||||||
BTM_TRACE_ERROR("btm_ble_process_adv_pkt: data_len %u + data + rssi exceeds remaining %u", data_len, (UINT16)(remaining - 8));
|
BTM_TRACE_ERROR("btm_ble_process_adv_pkt: data_len %u + data + rssi exceeds remaining %u", data_len, (UINT16)(remaining - 8));
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -480,6 +480,7 @@ void btm_ble_update_link_topology_mask(UINT8 role, BOOLEAN increase);
|
|||||||
/* direct connection utility */
|
/* direct connection utility */
|
||||||
BOOLEAN btm_send_pending_direct_conn(void);
|
BOOLEAN btm_send_pending_direct_conn(void);
|
||||||
void btm_ble_enqueue_direct_conn_req(void *p_param);
|
void btm_ble_enqueue_direct_conn_req(void *p_param);
|
||||||
|
void btm_ble_remove_direct_conn_req(void *p_param);
|
||||||
|
|
||||||
/* BLE address management */
|
/* BLE address management */
|
||||||
void btm_gen_resolvable_private_addr (void *p_cmd_cplt_cback);
|
void btm_gen_resolvable_private_addr (void *p_cmd_cplt_cback);
|
||||||
|
|||||||
Reference in New Issue
Block a user