From 19edb11baac6504e768d6baecf349d3769af25f4 Mon Sep 17 00:00:00 2001 From: Jingxiang Ge Date: Thu, 2 Dec 2021 15:59:01 +0800 Subject: [PATCH] qcacld-3.0: Fix possible memory leak of tx_time_per_power_level It is possible tx_time_per_power_level is not freed in last event, and it is reused in __wma_unified_radio_tx_power_level_stats_event_handler, the buffer size may be different for each event by manually test. Fix is to check if memory is freed before malloc, if not null, free it before malloc. Change-Id: I51064734cf97b9ff0ecbbaf27f38d5a223c91d3b CRs-Fixed: 3057436 --- core/wma/src/wma_utils.c | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/core/wma/src/wma_utils.c b/core/wma/src/wma_utils.c index 8e0f31f9cc60..4e1097a9d31a 100644 --- a/core/wma/src/wma_utils.c +++ b/core/wma/src/wma_utils.c @@ -1961,18 +1961,23 @@ static int wma_unified_radio_tx_power_level_stats_event_handler(void *handle, return -EINVAL; } - if (!rs_results->tx_time_per_power_level) { - rs_results->tx_time_per_power_level = qdf_mem_malloc( - sizeof(uint32_t) * - rs_results->total_num_tx_power_levels); - if (!rs_results->tx_time_per_power_level) { - /* In error case, atleast send the radio stats without - * tx_power_level stats */ - rs_results->total_num_tx_power_levels = 0; - link_stats_results->nr_received++; - goto post_stats; - } + if (rs_results->tx_time_per_power_level) { + qdf_mem_free(rs_results->tx_time_per_power_level); + rs_results->tx_time_per_power_level = NULL; } + + rs_results->tx_time_per_power_level = + qdf_mem_malloc(sizeof(uint32_t) * + rs_results->total_num_tx_power_levels); + if (!rs_results->tx_time_per_power_level) { + /* In error case, atleast send the radio stats without + * tx_power_level stats + */ + rs_results->total_num_tx_power_levels = 0; + link_stats_results->nr_received++; + goto post_stats; + } + qdf_mem_copy(&rs_results->tx_time_per_power_level[ fixed_param->power_level_offset], tx_power_level_values,