From 1b3be70ff7afd14066bf222bc315742f93027812 Mon Sep 17 00:00:00 2001 From: Himanshu Agarwal Date: Tue, 20 Feb 2018 12:16:57 +0530 Subject: [PATCH] qcacld-3.0: Free ACS channel list before allocating new list In __wlan_hdd_cfg80211_do_acs(), driver allocates memory for ACS channel list without checking if there is already some memory allocated for channel list or not. When SSR is triggered before ACS completion, ACS list does not get freed and after driver reinit, when a new do ACS comes, it allocates a new memory without deallocating the older memory. This causes memory leak. Free ACS channel list if already allocated before allocate a new list. Change-Id: Ic001c3daac518e97644da00cb82ea1d3fde4b539 CRs-Fixed: 2191839 --- core/hdd/src/wlan_hdd_cfg80211.c | 2 ++ core/hdd/src/wlan_hdd_hostapd.c | 8 ++------ 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/core/hdd/src/wlan_hdd_cfg80211.c b/core/hdd/src/wlan_hdd_cfg80211.c index 4a8c9e0afbb8..6ee1b4fc00bb 100644 --- a/core/hdd/src/wlan_hdd_cfg80211.c +++ b/core/hdd/src/wlan_hdd_cfg80211.c @@ -2603,6 +2603,8 @@ static int __wlan_hdd_cfg80211_do_acs(struct wiphy *wiphy, * hw_mode = any: only QCA_WLAN_VENDOR_ATTR_ACS_FREQ_LIST attr * is present */ + + wlan_hdd_undo_acs(adapter); if (tb[QCA_WLAN_VENDOR_ATTR_ACS_CH_LIST]) { char *tmp = nla_data(tb[QCA_WLAN_VENDOR_ATTR_ACS_CH_LIST]); diff --git a/core/hdd/src/wlan_hdd_hostapd.c b/core/hdd/src/wlan_hdd_hostapd.c index 8dfbae14c290..d4113abc4e20 100644 --- a/core/hdd/src/wlan_hdd_hostapd.c +++ b/core/hdd/src/wlan_hdd_hostapd.c @@ -6313,7 +6313,7 @@ QDF_STATUS hdd_init_ap_mode(struct hdd_adapter *adapter, bool reinit) if (!reinit) { adapter->session.ap.sap_config.acs_cfg.acs_mode = false; - qdf_mem_free(adapter->session.ap.sap_config.acs_cfg.ch_list); + wlan_hdd_undo_acs(adapter); qdf_mem_zero(&adapter->session.ap.sap_config.acs_cfg, sizeof(struct sap_acs_cfg)); } @@ -8269,11 +8269,7 @@ int wlan_hdd_cfg80211_start_bss(struct hdd_adapter *adapter, error: clear_bit(SOFTAP_INIT_DONE, &adapter->event_flags); - if (adapter->session.ap.sap_config.acs_cfg.ch_list) { - qdf_mem_free(adapter->session.ap.sap_config. - acs_cfg.ch_list); - adapter->session.ap.sap_config.acs_cfg.ch_list = NULL; - } + wlan_hdd_undo_acs(adapter); free: qdf_mem_free(sme_config);