From: Jouni Malinen Date: Sun, 1 Sep 2019 14:15:06 +0000 (+0300) Subject: EAP-TEAP peer: Clear Phase 2 EAP method on new Identity exchange X-Git-Tag: hostap_2_10~2391 X-Git-Url: http://git.ipfire.org/?p=thirdparty%2Fhostap.git;a=commitdiff_plain;h=4d78ba9900e0fb2ad3ba20c472255b01dadf4572 EAP-TEAP peer: Clear Phase 2 EAP method on new Identity exchange This is needed to allow clean transition from one inner EAP authentication method to another one if EAP method negotiation is needed within Phase 2. Signed-off-by: Jouni Malinen --- diff --git a/src/eap_peer/eap_teap.c b/src/eap_peer/eap_teap.c index 06665b9ef..f751fbec3 100644 --- a/src/eap_peer/eap_teap.c +++ b/src/eap_peer/eap_teap.c @@ -378,6 +378,22 @@ static int eap_teap_select_phase2_method(struct eap_teap_data *data, } +static void eap_teap_deinit_inner_eap(struct eap_sm *sm, + struct eap_teap_data *data) +{ + if (!data->phase2_priv || !data->phase2_method) + return; + + wpa_printf(MSG_DEBUG, + "EAP-TEAP: Phase 2 EAP sequence - deinitialize previous method"); + data->phase2_method->deinit(sm, data->phase2_priv); + data->phase2_method = NULL; + data->phase2_priv = NULL; + data->phase2_type.vendor = EAP_VENDOR_IETF; + data->phase2_type.method = EAP_TYPE_NONE; +} + + static int eap_teap_phase2_request(struct eap_sm *sm, struct eap_teap_data *data, struct eap_method_ret *ret, @@ -413,21 +429,15 @@ static int eap_teap_phase2_request(struct eap_sm *sm, wpa_printf(MSG_DEBUG, "EAP-TEAP: Phase 2 Request: type=%u:%u", vendor, method); if (vendor == EAP_VENDOR_IETF && method == EAP_TYPE_IDENTITY) { + eap_teap_deinit_inner_eap(sm, data); *resp = eap_sm_buildIdentity(sm, hdr->identifier, 1); return 0; } if (data->phase2_priv && data->phase2_method && (vendor != data->phase2_type.vendor || - method != data->phase2_type.method)) { - wpa_printf(MSG_DEBUG, - "EAP-TEAP: Phase 2 EAP sequence - deinitialize previous method"); - data->phase2_method->deinit(sm, data->phase2_priv); - data->phase2_method = NULL; - data->phase2_priv = NULL; - data->phase2_type.vendor = EAP_VENDOR_IETF; - data->phase2_type.method = EAP_TYPE_NONE; - } + method != data->phase2_type.method)) + eap_teap_deinit_inner_eap(sm, data); if (data->phase2_type.vendor == EAP_VENDOR_IETF && data->phase2_type.method == EAP_TYPE_NONE &&