]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
P2P: Fix interface deinit for failed group interface initialization
authorJouni Malinen <j@w1.fi>
Sun, 1 Mar 2015 19:50:34 +0000 (21:50 +0200)
committerJouni Malinen <j@w1.fi>
Sun, 1 Mar 2015 20:36:53 +0000 (22:36 +0200)
wpa_supplicant_deinit_iface() ends up removing all P2P groups if the
removed interface is the parent interface. This is correct behavior in
general, but this resulted in issues in the new group interface
initialization error path since wpa_s->parent was not assigned before
hitting this check. Fix this by assigning wpa_s->parent as part of
wpa_supplicant_add_iface().

Signed-off-by: Jouni Malinen <j@w1.fi>
wpa_supplicant/ctrl_iface.c
wpa_supplicant/dbus/dbus_new_handlers.c
wpa_supplicant/dbus/dbus_old_handlers.c
wpa_supplicant/main.c
wpa_supplicant/main_none.c
wpa_supplicant/main_winmain.c
wpa_supplicant/main_winsvc.c
wpa_supplicant/mesh.c
wpa_supplicant/p2p_supplicant.c
wpa_supplicant/wpa_supplicant.c
wpa_supplicant/wpa_supplicant_i.h

index 7c230dcabc43455259be3d2b48a7a1624b756184..b4aefb65ec25482be6ad0dd7bda61fc235b7c3ef 100644 (file)
@@ -8548,7 +8548,7 @@ static int wpa_supplicant_global_iface_add(struct wpa_global *global,
        if (wpa_supplicant_get_iface(global, iface.ifname))
                return -1;
 
-       return wpa_supplicant_add_iface(global, &iface) ? 0 : -1;
+       return wpa_supplicant_add_iface(global, &iface, NULL) ? 0 : -1;
 }
 
 
index e7c2dd8866057f3c22723c2a41422cdc964f87b1..f2e62ca96386478b3f4af6395db862378d35027d 100644 (file)
@@ -599,7 +599,7 @@ DBusMessage * wpas_dbus_handler_create_interface(DBusMessage *message,
                iface.confname = confname;
                iface.bridge_ifname = bridge_ifname;
                /* Otherwise, have wpa_supplicant attach to it. */
-               wpa_s = wpa_supplicant_add_iface(global, &iface);
+               wpa_s = wpa_supplicant_add_iface(global, &iface, NULL);
                if (wpa_s) {
                        const char *path = wpa_s->dbus_new_path;
 
index 955ea782fc7961b6f998874418c4b1d674a257b3..773ee8b49a2d3eca63681b050b42d678d970323f 100644 (file)
@@ -165,7 +165,7 @@ DBusMessage * wpas_dbus_global_add_interface(DBusMessage *message,
                iface.confname = confname;
                iface.bridge_ifname = bridge_ifname;
                /* Otherwise, have wpa_supplicant attach to it. */
-               wpa_s = wpa_supplicant_add_iface(global, &iface);
+               wpa_s = wpa_supplicant_add_iface(global, &iface, NULL);
                if (wpa_s) {
                        const char *path = wpa_s->dbus_path;
 
index 13e976949eb0648d50b1fbe4cd19236e87c84458..22827479c64354bead240e91d3556a586a5ccddc 100644 (file)
@@ -322,7 +322,7 @@ int main(int argc, char *argv[])
                        exitcode = -1;
                        break;
                }
-               wpa_s = wpa_supplicant_add_iface(global, &ifaces[i]);
+               wpa_s = wpa_supplicant_add_iface(global, &ifaces[i], NULL);
                if (wpa_s == NULL) {
                        exitcode = -1;
                        break;
index 010c30a3037df085cb92ebbff30626afb7ee16cb..4d3caf2a4da38a781b538991676741bcfcdb9353 100644 (file)
@@ -28,7 +28,7 @@ int main(int argc, char *argv[])
        memset(&iface, 0, sizeof(iface));
        /* TODO: set interface parameters */
 
-       if (wpa_supplicant_add_iface(global, &iface) == NULL)
+       if (wpa_supplicant_add_iface(global, &iface, NULL) == NULL)
                exitcode = -1;
 
        if (exitcode == 0)
index 93a68f17bc3d83593252b53d052e7c538ccb6dcf..e1dded0c349a7750597ae1eef1f00be22daba285 100644 (file)
@@ -61,7 +61,7 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                        exitcode = -1;
                        break;
                }
-               if (wpa_supplicant_add_iface(global, &ifaces[i]) == NULL)
+               if (wpa_supplicant_add_iface(global, &ifaces[i], NULL) == NULL)
                        exitcode = -1;
        }
 
index 0b7d5ce0696257a37202b765856c164024190376..9950aa99ae7a866349d8ace5d035fbba11890bf0 100644 (file)
@@ -119,7 +119,7 @@ static int read_interface(struct wpa_global *global, HKEY _hk,
 
        RegCloseKey(hk);
 
-       if (wpa_supplicant_add_iface(global, &iface) == NULL) {
+       if (wpa_supplicant_add_iface(global, &iface, NULL) == NULL) {
                if (skip_on_error)
                        wpa_printf(MSG_DEBUG, "Skipped interface '%s' due to "
                                   "initialization failure", iface.ifname);
index 32506b677c85def0d43f83167aafb3fcf7ca1454..cf3676c22f29cab28a8731f5eba0f192c201b5a5 100644 (file)
@@ -527,7 +527,7 @@ int wpas_mesh_add_interface(struct wpa_supplicant *wpa_s, char *ifname,
        iface.driver_param = wpa_s->conf->driver_param;
        iface.ctrl_interface = wpa_s->conf->ctrl_interface;
 
-       mesh_wpa_s = wpa_supplicant_add_iface(wpa_s->global, &iface);
+       mesh_wpa_s = wpa_supplicant_add_iface(wpa_s->global, &iface, wpa_s);
        if (!mesh_wpa_s) {
                wpa_printf(MSG_ERROR,
                           "mesh: Failed to create new wpa_supplicant interface");
@@ -535,6 +535,5 @@ int wpas_mesh_add_interface(struct wpa_supplicant *wpa_s, char *ifname,
                return -1;
        }
        mesh_wpa_s->mesh_if_created = 1;
-       mesh_wpa_s->parent = wpa_s;
        return 0;
 }
index 6ffe595882fb305b76306cd6474fc19e7194ad88..9c7c867ae2a21539e1222a34678d4e5afca78318 100644 (file)
@@ -1990,14 +1990,13 @@ wpas_p2p_init_group_interface(struct wpa_supplicant *wpa_s, int go)
        else
                iface.ctrl_interface = wpa_s->conf->ctrl_interface;
        iface.driver_param = wpa_s->conf->driver_param;
-       group_wpa_s = wpa_supplicant_add_iface(wpa_s->global, &iface);
+       group_wpa_s = wpa_supplicant_add_iface(wpa_s->global, &iface, wpa_s);
        if (group_wpa_s == NULL) {
                wpa_printf(MSG_ERROR, "P2P: Failed to create new "
                           "wpa_supplicant interface");
                return NULL;
        }
        wpa_s->pending_interface_name[0] = '\0';
-       group_wpa_s->parent = wpa_s;
        group_wpa_s->p2p_group_interface = go ? P2P_GROUP_INTERFACE_GO :
                P2P_GROUP_INTERFACE_CLIENT;
        wpa_s->global->p2p_group_formation = group_wpa_s;
@@ -4669,12 +4668,11 @@ int wpas_p2p_add_p2pdev_interface(struct wpa_supplicant *wpa_s,
        }
        iface.conf_p2p_dev = NULL;
 
-       p2pdev_wpa_s = wpa_supplicant_add_iface(wpa_s->global, &iface);
+       p2pdev_wpa_s = wpa_supplicant_add_iface(wpa_s->global, &iface, wpa_s);
        if (!p2pdev_wpa_s) {
                wpa_printf(MSG_DEBUG, "P2P: Failed to add P2P Device interface");
                return -1;
        }
-       p2pdev_wpa_s->parent = wpa_s;
        wpa_s->p2p_dev = p2pdev_wpa_s;
 
        wpa_s->pending_interface_name[0] = '\0';
index 15f856935b154c4c37cba5be467267fae41213d4..5848202b128f14deaaf794e200ad7b7e661cd281 100644 (file)
@@ -3230,7 +3230,8 @@ static int wpa_supplicant_daemon(const char *pid_file)
 }
 
 
-static struct wpa_supplicant * wpa_supplicant_alloc(void)
+static struct wpa_supplicant *
+wpa_supplicant_alloc(struct wpa_supplicant *parent)
 {
        struct wpa_supplicant *wpa_s;
 
@@ -3240,7 +3241,7 @@ static struct wpa_supplicant * wpa_supplicant_alloc(void)
        wpa_s->scan_req = INITIAL_SCAN_REQ;
        wpa_s->scan_interval = 5;
        wpa_s->new_connection = 1;
-       wpa_s->parent = wpa_s;
+       wpa_s->parent = parent ? parent : wpa_s;
        wpa_s->sched_scanning = 0;
 
        return wpa_s;
@@ -4294,6 +4295,7 @@ static void wpa_supplicant_deinit_iface(struct wpa_supplicant *wpa_s,
  * wpa_supplicant_add_iface - Add a new network interface
  * @global: Pointer to global data from wpa_supplicant_init()
  * @iface: Interface configuration options
+ * @parent: Parent interface or %NULL to assign new interface as parent
  * Returns: Pointer to the created interface or %NULL on failure
  *
  * This function is used to add new network interfaces for %wpa_supplicant.
@@ -4303,7 +4305,8 @@ static void wpa_supplicant_deinit_iface(struct wpa_supplicant *wpa_s,
  * e.g., when a hotplug network adapter is inserted.
  */
 struct wpa_supplicant * wpa_supplicant_add_iface(struct wpa_global *global,
-                                                struct wpa_interface *iface)
+                                                struct wpa_interface *iface,
+                                                struct wpa_supplicant *parent)
 {
        struct wpa_supplicant *wpa_s;
        struct wpa_interface t_iface;
@@ -4312,7 +4315,7 @@ struct wpa_supplicant * wpa_supplicant_add_iface(struct wpa_global *global,
        if (global == NULL || iface == NULL)
                return NULL;
 
-       wpa_s = wpa_supplicant_alloc();
+       wpa_s = wpa_supplicant_alloc(parent);
        if (wpa_s == NULL)
                return NULL;
 
index 0c0ee84a540053b79b88209d3b8e5f7c8a0439d0..26ff216b02da4b2d0b9a0f93ef6287bba36a3e2e 100644 (file)
@@ -1035,7 +1035,8 @@ void free_hw_features(struct wpa_supplicant *wpa_s);
 void wpa_show_license(void);
 
 struct wpa_supplicant * wpa_supplicant_add_iface(struct wpa_global *global,
-                                                struct wpa_interface *iface);
+                                                struct wpa_interface *iface,
+                                                struct wpa_supplicant *parent);
 int wpa_supplicant_remove_iface(struct wpa_global *global,
                                struct wpa_supplicant *wpa_s,
                                int terminate);