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;