Merge branch 'bugfix/fix_hid_memory_leak_v5.4' into 'release/v5.4'

fix(bt/bluedroid): Fixed HID memory leak (v5.4)

See merge request espressif/esp-idf!43332
This commit is contained in:
Wang Meng Yang
2025-11-14 14:09:14 +08:00
9 changed files with 17 additions and 16 deletions
+1 -4
View File
@@ -241,8 +241,5 @@ void *osi_calloc_func(size_t size)
void osi_free_func(void *ptr) void osi_free_func(void *ptr)
{ {
#if HEAP_MEMORY_DEBUG osi_free(ptr);
osi_mem_dbg_clean(ptr, __func__, __LINE__);
#endif
free(ptr);
} }
@@ -133,7 +133,7 @@ esp_err_t esp_bt_hid_device_send_report(esp_hidd_report_type_t type, uint8_t id,
args.send_report.data = data; args.send_report.data = data;
bt_status_t stat = btc_transfer_context(&msg, &args, sizeof(btc_hidd_args_t), bt_status_t stat = btc_transfer_context(&msg, &args, sizeof(btc_hidd_args_t),
btc_hd_arg_deep_copy, btc_hd_cb_arg_deep_free); btc_hd_arg_deep_copy, btc_hd_call_arg_deep_free);
return (stat == BT_STATUS_SUCCESS) ? ESP_OK : ESP_FAIL; return (stat == BT_STATUS_SUCCESS) ? ESP_OK : ESP_FAIL;
} }
@@ -117,7 +117,7 @@ esp_err_t esp_bt_hid_host_set_info(esp_bd_addr_t bd_addr, esp_hidh_hid_info_t *h
arg.set_info.hid_info = hid_info; arg.set_info.hid_info = hid_info;
bt_status_t stat = btc_transfer_context(&msg, &arg, sizeof(btc_hidh_args_t), bt_status_t stat = btc_transfer_context(&msg, &arg, sizeof(btc_hidh_args_t),
btc_hh_arg_deep_copy, btc_hh_cb_arg_deep_free); btc_hh_arg_deep_copy, btc_hh_call_arg_deep_free);
return (stat == BT_STATUS_SUCCESS) ? ESP_OK : ESP_FAIL; return (stat == BT_STATUS_SUCCESS) ? ESP_OK : ESP_FAIL;
} }
@@ -224,7 +224,7 @@ esp_err_t esp_bt_hid_host_set_report(esp_bd_addr_t bd_addr, esp_hidh_report_type
arg.set_report.report = report; arg.set_report.report = report;
bt_status_t stat = btc_transfer_context(&msg, &arg, sizeof(btc_hidh_args_t), bt_status_t stat = btc_transfer_context(&msg, &arg, sizeof(btc_hidh_args_t),
btc_hh_arg_deep_copy, btc_hh_cb_arg_deep_free); btc_hh_arg_deep_copy, btc_hh_call_arg_deep_free);
return (stat == BT_STATUS_SUCCESS) ? ESP_OK : ESP_FAIL; return (stat == BT_STATUS_SUCCESS) ? ESP_OK : ESP_FAIL;
} }
@@ -243,7 +243,7 @@ esp_err_t esp_bt_hid_host_send_data(esp_bd_addr_t bd_addr, uint8_t *data, size_t
arg.send_data.data = data; arg.send_data.data = data;
bt_status_t stat = btc_transfer_context(&msg, &arg, sizeof(btc_hidh_args_t), bt_status_t stat = btc_transfer_context(&msg, &arg, sizeof(btc_hidh_args_t),
btc_hh_arg_deep_copy, btc_hh_cb_arg_deep_free); btc_hh_arg_deep_copy, btc_hh_call_arg_deep_free);
return (stat == BT_STATUS_SUCCESS) ? ESP_OK : ESP_FAIL; return (stat == BT_STATUS_SUCCESS) ? ESP_OK : ESP_FAIL;
} }
@@ -75,6 +75,8 @@ btc_hd_cb_t btc_hd_cb = {0};
typedef void (bt_hid_copy_cb_t)(btc_msg_t *msg, void *p_dest, void *p_src); typedef void (bt_hid_copy_cb_t)(btc_msg_t *msg, void *p_dest, void *p_src);
static void btc_hd_cb_arg_deep_free(btc_msg_t *msg);
static inline void btc_hd_cb_to_app(esp_hidd_cb_event_t event, esp_hidd_cb_param_t *param) static inline void btc_hd_cb_to_app(esp_hidd_cb_event_t event, esp_hidd_cb_param_t *param)
{ {
esp_hd_cb_t btc_hd_cb = (esp_hd_cb_t)btc_profile_cb_get(BTC_PID_HD); esp_hd_cb_t btc_hd_cb = (esp_hd_cb_t)btc_profile_cb_get(BTC_PID_HD);
@@ -705,7 +707,7 @@ static void btc_hd_virtual_cable_unplug(void)
} }
} }
static void btc_hd_call_arg_deep_free(btc_msg_t *msg) void btc_hd_call_arg_deep_free(btc_msg_t *msg)
{ {
btc_hidd_args_t *arg = (btc_hidd_args_t *)msg->arg; btc_hidd_args_t *arg = (btc_hidd_args_t *)msg->arg;
@@ -756,7 +758,7 @@ void btc_hd_call_handler(btc_msg_t *msg)
btc_hd_call_arg_deep_free(msg); btc_hd_call_arg_deep_free(msg);
} }
void btc_hd_cb_arg_deep_free(btc_msg_t *msg) static void btc_hd_cb_arg_deep_free(btc_msg_t *msg)
{ {
tBTA_HD *arg = (tBTA_HD *)msg->arg; tBTA_HD *arg = (tBTA_HD *)msg->arg;
@@ -64,6 +64,8 @@ static bdstr_t bdstr;
#define is_hidh_init() (btc_hh_cb.status > BTC_HH_DISABLED) #define is_hidh_init() (btc_hh_cb.status > BTC_HH_DISABLED)
#define BTC_TIMEOUT_VUP_MS (3 * 1000) #define BTC_TIMEOUT_VUP_MS (3 * 1000)
static void btc_hh_cb_arg_deep_free(btc_msg_t *msg);
static inline void btc_hh_cb_to_app(esp_hidh_cb_event_t event, esp_hidh_cb_param_t *param) static inline void btc_hh_cb_to_app(esp_hidh_cb_event_t event, esp_hidh_cb_param_t *param)
{ {
esp_hh_cb_t btc_hh_cb = (esp_hh_cb_t)btc_profile_cb_get(BTC_PID_HH); esp_hh_cb_t btc_hh_cb = (esp_hh_cb_t)btc_profile_cb_get(BTC_PID_HH);
@@ -1097,7 +1099,7 @@ static void btc_hh_set_idle_time(btc_hidh_args_t *arg)
} }
} }
static void btc_hh_call_arg_deep_free(btc_msg_t *msg) void btc_hh_call_arg_deep_free(btc_msg_t *msg)
{ {
btc_hidh_args_t *arg = (btc_hidh_args_t *)msg->arg; btc_hidh_args_t *arg = (btc_hidh_args_t *)msg->arg;
@@ -1166,7 +1168,7 @@ void btc_hh_call_handler(btc_msg_t *msg)
btc_hh_call_arg_deep_free(msg); btc_hh_call_arg_deep_free(msg);
} }
void btc_hh_cb_arg_deep_free(btc_msg_t *msg) static void btc_hh_cb_arg_deep_free(btc_msg_t *msg)
{ {
tBTA_HH *arg = (tBTA_HH *)msg->arg; tBTA_HH *arg = (tBTA_HH *)msg->arg;
@@ -99,7 +99,7 @@ void btc_hd_call_handler(btc_msg_t *msg);
void btc_hd_cb_handler(btc_msg_t *msg); void btc_hd_cb_handler(btc_msg_t *msg);
void btc_hd_arg_deep_copy(btc_msg_t *msg, void *p_dest, void *p_src); void btc_hd_arg_deep_copy(btc_msg_t *msg, void *p_dest, void *p_src);
void btc_hd_cb_arg_deep_free(btc_msg_t *msg); void btc_hd_call_arg_deep_free(btc_msg_t *msg);
void btc_hd_get_profile_status(esp_hidd_profile_status_t *param); void btc_hd_get_profile_status(esp_hidd_profile_status_t *param);
@@ -181,8 +181,7 @@ void btc_hh_call_handler(btc_msg_t *msg);
void btc_hh_cb_handler(btc_msg_t *msg); void btc_hh_cb_handler(btc_msg_t *msg);
void btc_hh_arg_deep_copy(btc_msg_t *msg, void *p_dest, void *p_src); void btc_hh_arg_deep_copy(btc_msg_t *msg, void *p_dest, void *p_src);
void btc_hh_call_arg_deep_free(btc_msg_t *msg);
void btc_hh_cb_arg_deep_free(btc_msg_t *msg);
bool btc_hh_add_added_dev(BD_ADDR bd_addr, uint16_t attr_mask); bool btc_hh_add_added_dev(BD_ADDR bd_addr, uint16_t attr_mask);
@@ -775,6 +775,7 @@ tHID_STATUS hidd_conn_send_data(uint8_t channel, uint8_t msg_type, uint8_t param
} }
return HID_SUCCESS; return HID_SUCCESS;
} }
osi_free(p_buf);
return HID_ERR_NO_CONNECTION; return HID_ERR_NO_CONNECTION;
} }
#ifdef REPORT_TRANSFER_TIMESTAMP #ifdef REPORT_TRANSFER_TIMESTAMP
@@ -25,7 +25,6 @@
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include "osi/allocator.h"
#include "device/controller.h" #include "device/controller.h"
#include "stack/bt_types.h" #include "stack/bt_types.h"
#include "stack/hcimsgs.h" #include "stack/hcimsgs.h"
@@ -36,6 +35,7 @@
#include "stack/btm_api.h" #include "stack/btm_api.h"
#include "btm_int.h" #include "btm_int.h"
#include "stack/hcidefs.h" #include "stack/hcidefs.h"
#include "bt_common.h"
#include "osi/allocator.h" #include "osi/allocator.h"
#include "osi/list.h" #include "osi/list.h"