EAPOL auth: Avoid recursive wpa_sm_step() on WPA_DEAUTH case
authorJouni Malinen <jouni@qca.qualcomm.com>
Fri, 28 Aug 2015 13:32:14 +0000 (16:32 +0300)
committerJouni Malinen <j@w1.fi>
Fri, 28 Aug 2015 13:32:14 +0000 (16:32 +0300)
It was possible for wpa_auth_sm_event(WPA_DEAUTH) to be called from
wpa_sm_step() iteration in the case the EAPOL authenticator state
machine ended up requesting the station to be disconnected. This
resulted in unnecessary recursive call to wpa_sm_step(). Avoid this by
using the already running call to process the state change.

It was possible to hit this sequence in the hwsim test case
ap_wpa2_eap_eke_server_oom.

Signed-off-by: Jouni Malinen <jouni@qca.qualcomm.com>
src/ap/wpa_auth.c

index 4fead13..5ebfe5e 100644 (file)
@@ -1759,6 +1759,14 @@ int wpa_auth_sm_event(struct wpa_state_machine *sm, wpa_event event)
                        wpa_remove_ptk(sm);
        }
 
+       if (sm->in_step_loop) {
+               /*
+                * wpa_sm_step() is already running - avoid recursive call to
+                * it by making the existing loop process the new update.
+                */
+               sm->changed = TRUE;
+               return 0;
+       }
        return wpa_sm_step(sm);
 }