Преглед изворни кода

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
Himanshu Agarwal пре 7 година
родитељ
комит
1b3be70ff7
2 измењених фајлова са 4 додато и 6 уклоњено
  1. 2 0
      core/hdd/src/wlan_hdd_cfg80211.c
  2. 2 6
      core/hdd/src/wlan_hdd_hostapd.c

+ 2 - 0
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]);
 

+ 2 - 6
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);