summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSubhani Shaik <subhanis@codeaurora.org>2016-06-10 15:03:22 +0530
committerPaul Stewart <pstew@google.com>2016-06-10 19:19:50 +0000
commit301f662f9d16a487f5ebb491b30a9c9ee0871348 (patch)
tree5bfe6bae33645dc8b54a3c00c8afb21b3ab2d1ad
parent0eb820e5aa5689413367985d056e8f66d08ca30b (diff)
downloadwlan-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
-rw-r--r--qcwcn/wifi_hal/llstats.cpp25
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;
}