wpa_supplicant: Fix crash when terminating all interfaces
authorMoshe Benji <Moshe.Benji@intel.com>
Sun, 15 Dec 2013 08:50:07 +0000 (10:50 +0200)
committerJouni Malinen <j@w1.fi>
Tue, 24 Dec 2013 06:29:28 +0000 (08:29 +0200)
In wpa_supplicant_terminate_proc(), while iterating and
terminating interfaces, after an interface is terminated,
we can no longer access its memory as it is no longer valid
and causes a crash.

Fix this by saving the pointer to the next interface before freeing
the current one to avoid accessing an invalid memory location.

Signed-hostap: Moshe Benji <moshe.benji@intel.com>

wpa_supplicant/wpa_supplicant.c

index f25f546..897974b 100644 (file)
@@ -725,6 +725,7 @@ void wpa_supplicant_terminate_proc(struct wpa_global *global)
 #ifdef CONFIG_WPS
        struct wpa_supplicant *wpa_s = global->ifaces;
        while (wpa_s) {
+               struct wpa_supplicant *next = wpa_s->next;
 #ifdef CONFIG_P2P
                if (wpa_s->p2p_group_interface != NOT_P2P_GROUP_INTERFACE ||
                    (wpa_s->current_ssid && wpa_s->current_ssid->p2p_group))
@@ -732,7 +733,7 @@ void wpa_supplicant_terminate_proc(struct wpa_global *global)
 #endif /* CONFIG_P2P */
                if (wpas_wps_terminate_pending(wpa_s) == 1)
                        pending = 1;
-               wpa_s = wpa_s->next;
+               wpa_s = next;
        }
 #endif /* CONFIG_WPS */
        if (pending)