mirror of
https://git.kernel.org/pub/scm/network/wireless/iwd.git
synced 2024-11-16 17:09:24 +01:00
scan: fix invalid read when canceling an ongoing scan
When the survey code was added it neglected to add the same
cancelation logic that existed for the GET_SCAN call, i.e. if
a scan was canceled and there was a pending GET_SURVEY to the
kernel that needs to be canceled, and the request cleaned up.
Fixes: 35808debae
("scan: use GET_SURVEY for SNR calculation in ranking")
This commit is contained in:
parent
91f7253ae1
commit
64d68b4f08
10
src/scan.c
10
src/scan.c
@ -930,7 +930,7 @@ bool scan_cancel(uint64_t wdev_id, uint32_t id)
|
|||||||
* Takes care of the following cases:
|
* Takes care of the following cases:
|
||||||
* 1. If TRIGGER_SCAN is in flight
|
* 1. If TRIGGER_SCAN is in flight
|
||||||
* 2. TRIGGER_SCAN sent but bounced with -EBUSY
|
* 2. TRIGGER_SCAN sent but bounced with -EBUSY
|
||||||
* 3. Scan request is done but GET_SCAN is still pending
|
* 3. Scan request is done but GET_SCAN/GET_SURVEY is still pending
|
||||||
*
|
*
|
||||||
* For case 3, we can easily cancel the command and proceed with the
|
* For case 3, we can easily cancel the command and proceed with the
|
||||||
* other pending requests. For case 1 & 2, the subsequent pending
|
* other pending requests. For case 1 & 2, the subsequent pending
|
||||||
@ -945,6 +945,9 @@ bool scan_cancel(uint64_t wdev_id, uint32_t id)
|
|||||||
if (sc->start_cmd_id)
|
if (sc->start_cmd_id)
|
||||||
l_genl_family_cancel(nl80211, sc->start_cmd_id);
|
l_genl_family_cancel(nl80211, sc->start_cmd_id);
|
||||||
|
|
||||||
|
if (sc->get_survey_cmd_id)
|
||||||
|
l_genl_family_cancel(nl80211, sc->get_survey_cmd_id);
|
||||||
|
|
||||||
if (sc->get_scan_cmd_id)
|
if (sc->get_scan_cmd_id)
|
||||||
l_genl_family_cancel(nl80211, sc->get_scan_cmd_id);
|
l_genl_family_cancel(nl80211, sc->get_scan_cmd_id);
|
||||||
|
|
||||||
@ -2053,7 +2056,10 @@ static void get_survey_done(void *user_data)
|
|||||||
|
|
||||||
sc->get_survey_cmd_id = 0;
|
sc->get_survey_cmd_id = 0;
|
||||||
|
|
||||||
get_results(results);
|
if (!results->sr->canceled)
|
||||||
|
get_results(results);
|
||||||
|
else
|
||||||
|
get_scan_done(user_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool scan_survey(struct scan_results *results)
|
static bool scan_survey(struct scan_results *results)
|
||||||
|
Loading…
Reference in New Issue
Block a user