qcacld-3.0: Fix race condition between vendor scan and nl scan

If vendor scan and nl scan happen and abort at the same time, before
scan_block_work is scheduled, pAdapter->request may be set as vendor
scan request firstly, then scan_block_work is scheduled while at the
same time pAdapter->request may be as nl scan request by nl scan.

This causes memory leak and incorrect scan done called.

Change-Id: Id730f2d0041641099a26e76ab13ec419a48b4241
CRs-Fixed: 2134652
This commit is contained in:
bings 2017-10-31 08:54:12 +08:00 • committed by snandini
commit 86657feebf
2 changed files with 23 additions and 11 deletions

View file

@ -991,7 +991,7 @@ struct hdd_adapter {
/* TODO Move this to sta Ctx */
struct wireless_dev wdev;
struct cfg80211_scan_request *request;
uint8_t scan_source;
struct cfg80211_scan_request *vendor_request;
/** ops checks if Opportunistic Power Save is Enable or Not
* ctw stores ctWindow value once we receive Opps command from

View file

@ -316,12 +316,18 @@ static void __wlan_hdd_cfg80211_scan_block_cb(struct work_struct *work)
request->n_channels = 0;
hdd_err("##In DFS Master mode. Scan aborted. Null result sent");
if (NL_SCAN == adapter->scan_source)
hdd_cfg80211_scan_done(adapter, request, true);
else
hdd_vendor_scan_callback(adapter, request, true);
hdd_cfg80211_scan_done(adapter, request, true);
adapter->request = NULL;
}
request = adapter->vendor_request;
if (request) {
request->n_ssids = 0;
request->n_channels = 0;
hdd_err("In DFS Master mode. Scan aborted. Null result sent");
hdd_vendor_scan_callback(adapter, request, true);
adapter->vendor_request = NULL;
}
}
void wlan_hdd_cfg80211_scan_block_cb(struct work_struct *work)
@ -481,8 +487,10 @@ static int __wlan_hdd_cfg80211_scan(struct wiphy *wiphy,
conn_info.connState) &&
(!hdd_ctx->config->enable_connected_scan)) {
hdd_info("enable_connected_scan is false, Aborting scan");
adapter->request = request;
adapter->scan_source = source;
if (NL_SCAN == source)
adapter->request = request;
else
adapter->vendor_request = request;
schedule_work(&adapter->scan_block_work);
return 0;
}
@ -532,8 +540,10 @@ static int __wlan_hdd_cfg80211_scan(struct wiphy *wiphy,
* startup.
*/
hdd_err("##In DFS Master mode. Scan aborted");
adapter->request = request;
adapter->scan_source = source;
if (NL_SCAN == source)
adapter->request = request;
else
adapter->vendor_request = request;
schedule_work(&adapter->scan_block_work);
return 0;
@ -589,8 +599,10 @@ static int __wlan_hdd_cfg80211_scan(struct wiphy *wiphy,
if (adapter->device_mode == QDF_SAP_MODE &&
wlan_hdd_sap_skip_scan_check(hdd_ctx, request)) {
hdd_debug("sap scan skipped");
adapter->request = request;
adapter->scan_source = source;
if (NL_SCAN == source)
adapter->request = request;
else
adapter->vendor_request = request;
schedule_work(&adapter->scan_block_work);
return 0;
}