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
diff --git a/core/sap/dfs/src/dfs.c b/core/sap/dfs/src/dfs.c
index a2b5cff..e3fe339 100644
--- a/core/sap/dfs/src/dfs.c
+++ b/core/sap/dfs/src/dfs.c
@@ -253,6 +253,24 @@
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 @@
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 @@
#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;