diff options
author | Subhani Shaik <subhanis@codeaurora.org> | 2016-06-10 15:03:22 +0530 |
---|---|---|
committer | Paul Stewart <pstew@google.com> | 2016-06-10 19:19:50 +0000 |
commit | 301f662f9d16a487f5ebb491b30a9c9ee0871348 (patch) | |
tree | 5bfe6bae33645dc8b54a3c00c8afb21b3ab2d1ad /qcwcn | |
parent | 0eb820e5aa5689413367985d056e8f66d08ca30b (diff) | |
download | wlan-301f662f9d16a487f5ebb491b30a9c9ee0871348.tar.gz |
Wifi-HAL: Fix possible memory leak in llstatsnougat-dev
In QCA_NL80211_VENDOR_SUBCMD_LL_STATS_TYPE_PEERS event, dynamic
memory is allocated for pIfaceStat pointer. So, Free this
pointer in error conditions to avoid possible memory leakage.
Free memory allocated for tx_time_per_levels stats in
radio_stats.
Change-Id: I9af543e980af4eee400a9127449430f4b32a2fb4
BUG: 29247588
Diffstat (limited to 'qcwcn')
-rw-r--r-- | qcwcn/wifi_hal/llstats.cpp | 25 |
1 files changed, 20 insertions, 5 deletions
diff --git a/qcwcn/wifi_hal/llstats.cpp b/qcwcn/wifi_hal/llstats.cpp index c0e72fb..419c3c0 100644 --- a/qcwcn/wifi_hal/llstats.cpp +++ b/qcwcn/wifi_hal/llstats.cpp @@ -1020,6 +1020,11 @@ int LLStatsCommand::handleResponse(WifiEvent &reply) mResultsParams.radio_stat); if(mResultsParams.radio_stat) { + if (mResultsParams.radio_stat->tx_time_per_levels) + { + free(mResultsParams.radio_stat->tx_time_per_levels); + mResultsParams.radio_stat->tx_time_per_levels = NULL; + } free(mResultsParams.radio_stat); mResultsParams.radio_stat = NULL; } @@ -1033,7 +1038,7 @@ int LLStatsCommand::handleResponse(WifiEvent &reply) case QCA_NL80211_VENDOR_SUBCMD_LL_STATS_TYPE_PEERS: { struct nlattr *peerInfo; - wifi_iface_stat *pIfaceStat; + wifi_iface_stat *pIfaceStat = NULL; u32 numPeers, num_rates = 0; if (!tb_vendor[ QCA_WLAN_VENDOR_ATTR_LL_STATS_IFACE_NUM_PEERS]) @@ -1098,9 +1103,12 @@ int LLStatsCommand::handleResponse(WifiEvent &reply) } memset(pIfaceStat, 0, resultsBufSize); - if(mResultsParams.iface_stat) + if(mResultsParams.iface_stat) { memcpy ( pIfaceStat, mResultsParams.iface_stat, sizeof(wifi_iface_stat)); + free (mResultsParams.iface_stat); + mResultsParams.iface_stat = pIfaceStat; + } wifi_peer_info *pPeerStats; pIfaceStat->num_peers = numPeers; @@ -1132,9 +1140,6 @@ int LLStatsCommand::handleResponse(WifiEvent &reply) goto cleanup; } } - if(mResultsParams.iface_stat) - free (mResultsParams.iface_stat); - mResultsParams.iface_stat = pIfaceStat; } // Number of Radios are 1 for now @@ -1143,6 +1148,11 @@ int LLStatsCommand::handleResponse(WifiEvent &reply) mResultsParams.radio_stat); if(mResultsParams.radio_stat) { + if (mResultsParams.radio_stat->tx_time_per_levels) + { + free(mResultsParams.radio_stat->tx_time_per_levels); + mResultsParams.radio_stat->tx_time_per_levels = NULL; + } free(mResultsParams.radio_stat); mResultsParams.radio_stat = NULL; } @@ -1207,6 +1217,11 @@ int LLStatsCommand::handleResponse(WifiEvent &reply) cleanup: if(mResultsParams.radio_stat) { + if (mResultsParams.radio_stat->tx_time_per_levels) + { + free(mResultsParams.radio_stat->tx_time_per_levels); + mResultsParams.radio_stat->tx_time_per_levels = NULL; + } free(mResultsParams.radio_stat); mResultsParams.radio_stat = NULL; } |