Merge branch 'bugfix/fix_ble_mesh_memory_leak' into 'master'

ble_mesh: Fix memory leak when node is reset

Closes BLEMESH-122

See merge request espressif/esp-idf!7076
This commit is contained in:
Jiang Jiang Jian 2020-01-10 11:43:49 +08:00
commit 9ecc2c3309
9 changed files with 132 additions and 85 deletions

View file

@ -1649,7 +1649,7 @@ int bt_mesh_cfg_cli_init(struct bt_mesh_model *model, bool primary)
return -EINVAL;
}
/* TODO: call osi_free() when deinit function is invoked*/
if (!client->internal_data) {
internal = osi_calloc(sizeof(config_internal_data_t));
if (!internal) {
BT_ERR("Allocate memory for Configuration Client internal data fail");
@ -1662,6 +1662,9 @@ int bt_mesh_cfg_cli_init(struct bt_mesh_model *model, bool primary)
client->op_pair_size = ARRAY_SIZE(cfg_op_pair);
client->op_pair = cfg_op_pair;
client->internal_data = internal;
} else {
bt_mesh_client_clear_list(client->internal_data);
}
cli = client;

View file

@ -454,7 +454,7 @@ int bt_mesh_health_cli_init(struct bt_mesh_model *model, bool primary)
return -EINVAL;
}
/* TODO: call osi_free() when deinit function is invoked*/
if (!client->internal_data) {
internal = osi_calloc(sizeof(health_internal_data_t));
if (!internal) {
BT_ERR("%s, Failed to allocate memory", __func__);
@ -467,6 +467,9 @@ int bt_mesh_health_cli_init(struct bt_mesh_model *model, bool primary)
client->op_pair_size = ARRAY_SIZE(health_op_pair);
client->op_pair = health_op_pair;
client->internal_data = internal;
} else {
bt_mesh_client_clear_list(client->internal_data);
}
bt_mesh_health_client_mutex_new();

View file

@ -266,7 +266,7 @@ int bt_mesh_client_init(struct bt_mesh_model *model)
return -EINVAL;
}
/* TODO: call osi_free() when deinit function is invoked */
if (!cli->internal_data) {
data = osi_calloc(sizeof(bt_mesh_client_internal_data_t));
if (!data) {
BT_ERR("%s, Failed to allocate memory", __func__);
@ -278,6 +278,9 @@ int bt_mesh_client_init(struct bt_mesh_model *model)
cli->model = model;
cli->internal_data = data;
} else {
bt_mesh_client_clear_list(cli->internal_data);
}
bt_mesh_client_model_mutex_new();
@ -316,6 +319,28 @@ int bt_mesh_client_free_node(bt_mesh_client_node_t *node)
return 0;
}
int bt_mesh_client_clear_list(void *data)
{
bt_mesh_client_internal_data_t *internal = NULL;
bt_mesh_client_node_t *node = NULL;
if (!data) {
BT_ERR("%s, Invalid parameter", __func__);
return -EINVAL;
}
internal = (bt_mesh_client_internal_data_t *)data;
bt_mesh_list_lock();
while (!sys_slist_is_empty(&internal->queue)) {
node = (void *)sys_slist_get_not_empty(&internal->queue);
osi_free(node);
}
bt_mesh_list_unlock();
return 0;
}
int bt_mesh_set_client_model_role(bt_mesh_role_param_t *common)
{
bt_mesh_client_user_data_t *client = NULL;

View file

@ -1172,7 +1172,7 @@ static int generic_client_init(struct bt_mesh_model *model, bool primary)
return -EINVAL;
}
/* TODO: call osi_free() when deinit function is invoked*/
if (!client->internal_data) {
internal = osi_calloc(sizeof(generic_internal_data_t));
if (!internal) {
BT_ERR("%s, Failed to allocate memory", __func__);
@ -1185,6 +1185,9 @@ static int generic_client_init(struct bt_mesh_model *model, bool primary)
client->op_pair_size = ARRAY_SIZE(gen_op_pair);
client->op_pair = gen_op_pair;
client->internal_data = internal;
} else {
bt_mesh_client_clear_list(client->internal_data);
}
bt_mesh_generic_client_mutex_new();

View file

@ -108,6 +108,8 @@ int bt_mesh_client_send_msg(struct bt_mesh_model *model,
int bt_mesh_client_free_node(bt_mesh_client_node_t *node);
int bt_mesh_client_clear_list(void *data);
enum {
NODE = 0,
PROVISIONER,

View file

@ -1362,7 +1362,7 @@ static int light_client_init(struct bt_mesh_model *model, bool primary)
return -EINVAL;
}
/* TODO: call osi_free() when deinit function is invoked*/
if (!client->internal_data) {
internal = osi_calloc(sizeof(light_internal_data_t));
if (!internal) {
BT_ERR("%s, Failed to allocate memory", __func__);
@ -1375,6 +1375,9 @@ static int light_client_init(struct bt_mesh_model *model, bool primary)
client->op_pair_size = ARRAY_SIZE(light_op_pair);
client->op_pair = light_op_pair;
client->internal_data = internal;
} else {
bt_mesh_client_clear_list(client->internal_data);
}
bt_mesh_light_client_mutex_new();

View file

@ -604,7 +604,7 @@ int bt_mesh_sensor_cli_init(struct bt_mesh_model *model, bool primary)
return -EINVAL;
}
/* TODO: call osi_free() when deinit function is invoked*/
if (!client->internal_data) {
internal = osi_calloc(sizeof(sensor_internal_data_t));
if (!internal) {
BT_ERR("%s, Failed to allocate memory", __func__);
@ -617,6 +617,9 @@ int bt_mesh_sensor_cli_init(struct bt_mesh_model *model, bool primary)
client->op_pair_size = ARRAY_SIZE(sensor_op_pair);
client->op_pair = sensor_op_pair;
client->internal_data = internal;
} else {
bt_mesh_client_clear_list(client->internal_data);
}
bt_mesh_sensor_client_mutex_new();

View file

@ -667,7 +667,7 @@ static int time_scene_client_init(struct bt_mesh_model *model, bool primary)
return -EINVAL;
}
/* TODO: call osi_free() when deinit function is invoked*/
if (!client->internal_data) {
internal = osi_calloc(sizeof(time_scene_internal_data_t));
if (!internal) {
BT_ERR("%s, Failed to allocate memory", __func__);
@ -680,6 +680,9 @@ static int time_scene_client_init(struct bt_mesh_model *model, bool primary)
client->op_pair_size = ARRAY_SIZE(time_scene_op_pair);
client->op_pair = time_scene_op_pair;
client->internal_data = internal;
} else {
bt_mesh_client_clear_list(client->internal_data);
}
bt_mesh_time_scene_client_mutex_new();

View file

@ -193,9 +193,11 @@ void bt_mesh_server_alloc_ctx(struct k_work *work)
* Here we use the allocated heap memory to store the "struct bt_mesh_msg_ctx".
*/
__ASSERT(work, "%s, Invalid parameter", __func__);
if (!work->_reserved) {
work->_reserved = osi_calloc(sizeof(struct bt_mesh_msg_ctx));
__ASSERT(work->_reserved, "%s, Failed to allocate memory", __func__);
}
}
bool bt_mesh_is_server_recv_last_msg(struct bt_mesh_last_msg_info *last,
u8_t tid, u16_t src, u16_t dst, s64_t *now)