diff options
| -rw-r--r-- | core/wma/src/wma_utils.c | 47 |
1 files changed, 25 insertions, 22 deletions
diff --git a/core/wma/src/wma_utils.c b/core/wma/src/wma_utils.c index eb8130485755..80d02685cabc 100644 --- a/core/wma/src/wma_utils.c +++ b/core/wma/src/wma_utils.c @@ -1250,7 +1250,8 @@ static int wma_unified_link_peer_stats_event_handler(void *handle, wmi_rate_stats *rate_stats; tSirLLStatsResults *link_stats_results; uint8_t *results, *t_peer_stats, *t_rate_stats; - uint32_t count, num_rates = 0, rate_cnt; + uint32_t count, rate_cnt; + uint32_t total_num_rates = 0; uint32_t next_res_offset, next_peer_offset, next_rate_offset; size_t peer_info_size, peer_stats_size, rate_stats_size; size_t link_stats_results_size; @@ -1278,8 +1279,8 @@ static int wma_unified_link_peer_stats_event_handler(void *handle, * cmd_param_info contains * wmi_peer_stats_event_fixed_param fixed_param; * num_peers * size of(struct wmi_peer_link_stats) - * num_rates * size of(struct wmi_rate_stats) - * num_rates is the sum of the rates of all the peers. + * total_num_rates * size of(struct wmi_rate_stats) + * total_num_rates is the sum of the rates of all the peers. */ fixed_param = param_tlvs->fixed_param; peer_stats = param_tlvs->peer_stats; @@ -1292,22 +1293,33 @@ static int wma_unified_link_peer_stats_event_handler(void *handle, } do { - if (peer_stats->num_rates > - WMI_SVC_MSG_MAX_SIZE/sizeof(wmi_rate_stats)) { - excess_data = true; - break; - } else { - buf_len = - peer_stats->num_rates * sizeof(wmi_rate_stats); - } if (fixed_param->num_peers > WMI_SVC_MSG_MAX_SIZE/sizeof(wmi_peer_link_stats)) { excess_data = true; break; } else { - buf_len += fixed_param->num_peers * + buf_len = fixed_param->num_peers * sizeof(wmi_peer_link_stats); } + temp_peer_stats = (wmi_peer_link_stats *) peer_stats; + for (count = 0; count < fixed_param->num_peers; count++) { + if (temp_peer_stats->num_rates > + WMI_SVC_MSG_MAX_SIZE / sizeof(wmi_rate_stats)) { + excess_data = true; + break; + } else { + total_num_rates += temp_peer_stats->num_rates; + if (total_num_rates > + WMI_SVC_MSG_MAX_SIZE / + sizeof(wmi_rate_stats)) { + excess_data = true; + break; + } + buf_len += temp_peer_stats->num_rates * + sizeof(wmi_rate_stats); + } + temp_peer_stats++; + } } while (0); if (excess_data || @@ -1318,22 +1330,13 @@ static int wma_unified_link_peer_stats_event_handler(void *handle, return -EINVAL; } - /* - * num_rates - sum of the rates of all the peers - */ - temp_peer_stats = (wmi_peer_link_stats *) peer_stats; - for (count = 0; count < fixed_param->num_peers; count++) { - num_rates += temp_peer_stats->num_rates; - temp_peer_stats++; - } - peer_stats_size = sizeof(tSirWifiPeerStat); peer_info_size = sizeof(tSirWifiPeerInfo); rate_stats_size = sizeof(tSirWifiRateStat); link_stats_results_size = sizeof(*link_stats_results) + peer_stats_size + (fixed_param->num_peers * peer_info_size) + - (num_rates * rate_stats_size); + (total_num_rates * rate_stats_size); link_stats_results = qdf_mem_malloc(link_stats_results_size); if (NULL == link_stats_results) { |
