Set current_ssid before changing state to ASSOCIATING

For hidden GBK encoding of a Chinese SSID, both the UTF-8 and GBK
encoding profiles are added into wpa_supplicant to make sure the
connection succeeds. In this situation, wpa_supplicant_select_network()
will not be called so current_ssid is NULL when association begins.

Android monitors the WPA_EVENT_STATE_CHANGE event to get the SSID and
BSSID. When connecting to a Chinese SSID, in case of association
rejection happens, Android will report null SSID to OEM APP because
current_ssid is updated after wpa_supplicant_set_state(wpa_s,
WPA_ASSOCIATING), which may cause confusion.

Fix this by setting the current_ssid before changing state to
ASSOCIATING.

Signed-off-by: Jouni Malinen <quic_jouni@quicinc.com>
This commit is contained in:
Xinyue Ling 2022-06-13 14:29:56 +08:00 committed by Jouni Malinen
parent 8dd8267413
commit 6b461f68c7

View file

@ -3772,6 +3772,11 @@ static void wpas_start_assoc_cb(struct wpa_radio_work *work, int deinit)
wpa_supplicant_set_wpa_none_key(wpa_s, ssid); wpa_supplicant_set_wpa_none_key(wpa_s, ssid);
} }
/* Set current_ssid before changing state to ASSOCIATING, so that the
* selected SSID is available to wpas_notify_state_changed(). */
old_ssid = wpa_s->current_ssid;
wpa_s->current_ssid = ssid;
wpa_supplicant_set_state(wpa_s, WPA_ASSOCIATING); wpa_supplicant_set_state(wpa_s, WPA_ASSOCIATING);
if (bss) { if (bss) {
params.ssid = bss->ssid; params.ssid = bss->ssid;
@ -4007,7 +4012,7 @@ static void wpas_start_assoc_cb(struct wpa_radio_work *work, int deinit)
#endif /* CONFIG_P2P */ #endif /* CONFIG_P2P */
if (wpa_s->reassoc_same_ess && !is_zero_ether_addr(prev_bssid) && if (wpa_s->reassoc_same_ess && !is_zero_ether_addr(prev_bssid) &&
wpa_s->current_ssid) old_ssid)
params.prev_bssid = prev_bssid; params.prev_bssid = prev_bssid;
#ifdef CONFIG_SAE #ifdef CONFIG_SAE
@ -4075,15 +4080,13 @@ static void wpas_start_assoc_cb(struct wpa_radio_work *work, int deinit)
} }
#endif /* CONFIG_WEP */ #endif /* CONFIG_WEP */
if (wpa_s->current_ssid && wpa_s->current_ssid != ssid) { if (old_ssid && old_ssid != ssid) {
/* /*
* Do not allow EAP session resumption between different * Do not allow EAP session resumption between different
* network configurations. * network configurations.
*/ */
eapol_sm_invalidate_cached_session(wpa_s->eapol); eapol_sm_invalidate_cached_session(wpa_s->eapol);
} }
old_ssid = wpa_s->current_ssid;
wpa_s->current_ssid = ssid;
if (!wpas_driver_bss_selection(wpa_s) || ssid->bssid_set) { if (!wpas_driver_bss_selection(wpa_s) || ssid->bssid_set) {
wpa_s->current_bss = bss; wpa_s->current_bss = bss;