IBSS RSN: Check explicitly that WPA auth sm assoc call succeeded

Verify that association processing did not end up freeing the state
machine. This should not really happen in practice, but better verify
it anyway.
This commit is contained in:
Jouni Malinen 2010-01-10 21:45:44 +02:00
parent f337f0e950
commit 6f9b5d1696
3 changed files with 18 additions and 17 deletions

View file

@ -493,26 +493,25 @@ wpa_auth_sta_init(struct wpa_authenticator *wpa_auth, const u8 *addr)
} }
void wpa_auth_sta_associated(struct wpa_authenticator *wpa_auth, int wpa_auth_sta_associated(struct wpa_authenticator *wpa_auth,
struct wpa_state_machine *sm) struct wpa_state_machine *sm)
{ {
if (wpa_auth == NULL || !wpa_auth->conf.wpa || sm == NULL) if (wpa_auth == NULL || !wpa_auth->conf.wpa || sm == NULL)
return; return -1;
#ifdef CONFIG_IEEE80211R #ifdef CONFIG_IEEE80211R
if (sm->ft_completed) { if (sm->ft_completed) {
wpa_auth_logger(wpa_auth, sm->addr, LOGGER_DEBUG, wpa_auth_logger(wpa_auth, sm->addr, LOGGER_DEBUG,
"FT authentication already completed - do not " "FT authentication already completed - do not "
"start 4-way handshake"); "start 4-way handshake");
return; return 0;
} }
#endif /* CONFIG_IEEE80211R */ #endif /* CONFIG_IEEE80211R */
if (sm->started) { if (sm->started) {
os_memset(&sm->key_replay, 0, sizeof(sm->key_replay)); os_memset(&sm->key_replay, 0, sizeof(sm->key_replay));
sm->ReAuthenticationRequest = TRUE; sm->ReAuthenticationRequest = TRUE;
wpa_sm_step(sm); return wpa_sm_step(sm);
return;
} }
wpa_auth_logger(wpa_auth, sm->addr, LOGGER_DEBUG, wpa_auth_logger(wpa_auth, sm->addr, LOGGER_DEBUG,
@ -521,10 +520,10 @@ void wpa_auth_sta_associated(struct wpa_authenticator *wpa_auth,
sm->Init = TRUE; sm->Init = TRUE;
if (wpa_sm_step(sm) == 1) if (wpa_sm_step(sm) == 1)
return; /* should not really happen */ return 1; /* should not really happen */
sm->Init = FALSE; sm->Init = FALSE;
sm->AuthenticationRequest = TRUE; sm->AuthenticationRequest = TRUE;
wpa_sm_step(sm); return wpa_sm_step(sm);
} }
@ -1178,12 +1177,12 @@ void wpa_remove_ptk(struct wpa_state_machine *sm)
} }
void wpa_auth_sm_event(struct wpa_state_machine *sm, wpa_event event) int wpa_auth_sm_event(struct wpa_state_machine *sm, wpa_event event)
{ {
int remove_ptk = 1; int remove_ptk = 1;
if (sm == NULL) if (sm == NULL)
return; return -1;
wpa_auth_vlogger(sm->wpa_auth, sm->addr, LOGGER_DEBUG, wpa_auth_vlogger(sm->wpa_auth, sm->addr, LOGGER_DEBUG,
"event %d notification", event); "event %d notification", event);
@ -1213,7 +1212,7 @@ void wpa_auth_sm_event(struct wpa_state_machine *sm, wpa_event event)
#ifdef CONFIG_IEEE80211R #ifdef CONFIG_IEEE80211R
/* Using FT protocol, not WPA auth state machine */ /* Using FT protocol, not WPA auth state machine */
sm->ft_completed = 1; sm->ft_completed = 1;
return; return 0;
#else /* CONFIG_IEEE80211R */ #else /* CONFIG_IEEE80211R */
break; break;
#endif /* CONFIG_IEEE80211R */ #endif /* CONFIG_IEEE80211R */
@ -1236,7 +1235,7 @@ void wpa_auth_sm_event(struct wpa_state_machine *sm, wpa_event event)
wpa_remove_ptk(sm); wpa_remove_ptk(sm);
} }
wpa_sm_step(sm); return wpa_sm_step(sm);
} }

View file

@ -219,7 +219,7 @@ int wpa_validate_wpa_ie(struct wpa_authenticator *wpa_auth,
int wpa_auth_uses_mfp(struct wpa_state_machine *sm); int wpa_auth_uses_mfp(struct wpa_state_machine *sm);
struct wpa_state_machine * struct wpa_state_machine *
wpa_auth_sta_init(struct wpa_authenticator *wpa_auth, const u8 *addr); wpa_auth_sta_init(struct wpa_authenticator *wpa_auth, const u8 *addr);
void wpa_auth_sta_associated(struct wpa_authenticator *wpa_auth, int wpa_auth_sta_associated(struct wpa_authenticator *wpa_auth,
struct wpa_state_machine *sm); struct wpa_state_machine *sm);
void wpa_auth_sta_no_wpa(struct wpa_state_machine *sm); void wpa_auth_sta_no_wpa(struct wpa_state_machine *sm);
void wpa_auth_sta_deinit(struct wpa_state_machine *sm); void wpa_auth_sta_deinit(struct wpa_state_machine *sm);
@ -231,7 +231,7 @@ typedef enum {
WPA_REAUTH_EAPOL, WPA_ASSOC_FT WPA_REAUTH_EAPOL, WPA_ASSOC_FT
} wpa_event; } wpa_event;
void wpa_remove_ptk(struct wpa_state_machine *sm); void wpa_remove_ptk(struct wpa_state_machine *sm);
void wpa_auth_sm_event(struct wpa_state_machine *sm, wpa_event event); int wpa_auth_sm_event(struct wpa_state_machine *sm, wpa_event event);
void wpa_auth_sm_notify(struct wpa_state_machine *sm); void wpa_auth_sm_notify(struct wpa_state_machine *sm);
void wpa_gtk_rekey(struct wpa_authenticator *wpa_auth); void wpa_gtk_rekey(struct wpa_authenticator *wpa_auth);
int wpa_get_mib(struct wpa_authenticator *wpa_auth, char *buf, size_t buflen); int wpa_get_mib(struct wpa_authenticator *wpa_auth, char *buf, size_t buflen);

View file

@ -326,9 +326,11 @@ static int ibss_rsn_auth_init(struct ibss_rsn *ibss_rsn,
return -1; return -1;
} }
wpa_auth_sm_event(peer->auth, WPA_ASSOC); if (wpa_auth_sm_event(peer->auth, WPA_ASSOC))
return -1;
wpa_auth_sta_associated(ibss_rsn->auth_group, peer->auth); if (wpa_auth_sta_associated(ibss_rsn->auth_group, peer->auth))
return -1;
return 0; return 0;
} }