From 301f662f9d16a487f5ebb491b30a9c9ee0871348 Mon Sep 17 00:00:00 2001 From: Subhani Shaik Date: Fri, 10 Jun 2016 15:03:22 +0530 Subject: Wifi-HAL: Fix possible memory leak in llstats 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 --- qcwcn/wifi_hal/llstats.cpp | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) (limited to 'qcwcn') 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; } -- cgit v1.2.3