From a7852cbd2f1e9732eef437387d5bfcc2f2787203 Mon Sep 17 00:00:00 2001 From: Kapil Gupta Date: Tue, 9 Aug 2016 18:43:46 +0530 Subject: qcacld-3.0: Fix memory leak issue qcacld-2.0 to qcacld-3.0 propagation Memory allocated for dfs filters in dfs_attach() API does not get freed in failure case. Add changes to fix memory leak issue. Change-Id: Icdd4a382685471c0d3cf8115cec30fcb307eedfb CRs-Fixed: 1038603 --- core/sap/dfs/src/dfs.c | 48 +++++++++++++++++++++++++++++------------------- 1 file changed, 29 insertions(+), 19 deletions(-) diff --git a/core/sap/dfs/src/dfs.c b/core/sap/dfs/src/dfs.c index a2b5cff32ac1..e3fe339b9657 100644 --- a/core/sap/dfs/src/dfs.c +++ b/core/sap/dfs/src/dfs.c @@ -253,6 +253,24 @@ error: return status; } +/** + * dfs_free_filter() - free memory allocated for dfs ft_filters + * @radarf: pointer holding ft_filters + * + * Return: NA +*/ +static void dfs_free_filter(struct dfs_filtertype *radarf) +{ + int i; + + for (i = 0; i < DFS_MAX_NUM_RADAR_FILTERS; i++) { + if (radarf->ft_filters[i]) { + qdf_mem_free(radarf->ft_filters[i]); + radarf->ft_filters[i] = NULL; + } + } +} + int dfs_attach(struct ieee80211com *ic) { int i, n; @@ -440,11 +458,20 @@ int dfs_attach(struct ieee80211com *ic) return 0; bad2: - OS_FREE(dfs->dfs_radartable); - dfs->dfs_radartable = NULL; + if (dfs->dfs_radartable != NULL) { + for (n = 0; n < 256; n++) { + if (dfs->dfs_radartable[n] != NULL) { + OS_FREE(dfs->dfs_radartable[n]); + dfs->dfs_radartable[n] = NULL; + } + } + OS_FREE(dfs->dfs_radartable); + dfs->dfs_radartable = NULL; + } bad1: for (n = 0; n < DFS_MAX_RADAR_TYPES; n++) { if (dfs->dfs_radarf[n] != NULL) { + dfs_free_filter(dfs->dfs_radarf[n]); OS_FREE(dfs->dfs_radarf[n]); dfs->dfs_radarf[n] = NULL; } @@ -471,23 +498,6 @@ bad1: #undef N } -/** - * dfs_free_filter() - free memory allocated for dfs ft_filters - * @radarf: pointer holding ft_filters - * - * Return: NA -*/ -static void dfs_free_filter(struct dfs_filtertype *radarf) -{ - int i; - - for (i = 0; i < DFS_MAX_NUM_RADAR_FILTERS; i++) { - if (radarf->ft_filters[i]) { - qdf_mem_free(radarf->ft_filters[i]); - radarf->ft_filters[i] = NULL; - } - } -} void dfs_detach(struct ieee80211com *ic) { struct ath_dfs *dfs = (struct ath_dfs *)ic->ic_dfs; -- cgit v1.2.3