summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVignesh Viswanathan <viswanat@codeaurora.org>2017-11-28 16:58:24 +0530
committersnandini <snandini@codeaurora.org>2017-11-29 12:27:05 -0800
commita050d647825f5f474196a7f747456e196a0cf3a5 (patch)
treeae837c144e82a59670dedfa54832d50f0f87bb05
parent00f125a5aab68d1be89afd57eb8a75e06b9a8a12 (diff)
qcacld-3.0: Fix buffer overflow in wma radio_tx_power_level_stats handler
In function wma_unified_radio_tx_power_level_stats_event_handler, power_level_offset is received from the FW and is used to memcpy data from FW to local tx_time_per_power_level for num_tx_power_levels length. However tx_time_per_power_level is allocated only for total_num_tx_power_levels length. If the power_level_offset is greater than total_num_tx_power_levels, then a buffer overwrite would occur. Add sanity check to make sure power_level_offset does not exceed total_num_tx_power_levels Change-Id: Ia363512ee35bb0e30b137c20bf092238c2e356da CRs-Fixed: 2149501
-rw-r--r--core/wma/src/wma_utils.c14
1 files changed, 13 insertions, 1 deletions
diff --git a/core/wma/src/wma_utils.c b/core/wma/src/wma_utils.c
index 3cf44f946a54..335bf314a037 100644
--- a/core/wma/src/wma_utils.c
+++ b/core/wma/src/wma_utils.c
@@ -1500,9 +1500,9 @@ static int wma_unified_radio_tx_power_level_stats_event_handler(void *handle,
sizeof(*fixed_param)) / sizeof(uint32_t))) {
WMA_LOGE("%s: excess tx_power buffers:%d", __func__,
fixed_param->num_tx_power_levels);
- QDF_ASSERT(0);
return -EINVAL;
}
+
rs_results = (tSirWifiRadioStat *) &link_stats_results->results[0] +
fixed_param->radio_id;
tx_power_level_values = (uint8_t *) param_tlvs->tx_time_per_power_level;
@@ -1514,6 +1514,18 @@ static int wma_unified_radio_tx_power_level_stats_event_handler(void *handle,
goto post_stats;
}
+ if ((fixed_param->power_level_offset >
+ rs_results->total_num_tx_power_levels) ||
+ (fixed_param->num_tx_power_levels >
+ rs_results->total_num_tx_power_levels -
+ fixed_param->power_level_offset)) {
+ WMA_LOGE("%s: Invalid offset %d total_num %d num %d",
+ __func__, fixed_param->power_level_offset,
+ rs_results->total_num_tx_power_levels,
+ fixed_param->num_tx_power_levels);
+ return -EINVAL;
+ }
+
if (!rs_results->tx_time_per_power_level) {
rs_results->tx_time_per_power_level = qdf_mem_malloc(
sizeof(uint32_t) *