]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
EAP-TEAP peer: Clear Phase 2 EAP method on new Identity exchange
authorJouni Malinen <j@w1.fi>
Sun, 1 Sep 2019 14:15:06 +0000 (17:15 +0300)
committerJouni Malinen <j@w1.fi>
Sun, 1 Sep 2019 14:19:43 +0000 (17:19 +0300)
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 <j@w1.fi>
src/eap_peer/eap_teap.c

index 06665b9ef22857fdbf59f791405ecd18879177b5..f751fbec32c270a5695bc1b1596a778a618ce1e8 100644 (file)
@@ -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 &&