]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
D-Bus: Fix network block type change
authorJouni Malinen <j@w1.fi>
Sat, 7 Feb 2015 14:17:11 +0000 (16:17 +0200)
committerJouni Malinen <j@w1.fi>
Sat, 7 Feb 2015 14:19:08 +0000 (16:19 +0200)
It is possible for a network profile to change its type from P2P
persistent group to a normal network and back. The D-Bus interface uses
different types of objects for those, so the object needs to
re-registered in case of type change. This fixes issues in leaving
behind an incorrect type of object and leaking memory when freeing such
a network block that has had its disabled parameter changed.

Signed-off-by: Jouni Malinen <j@w1.fi>
wpa_supplicant/ctrl_iface.c
wpa_supplicant/notify.c
wpa_supplicant/notify.h

index c59ccc3ce973d893534e26f712e890ea4053a005..428a496d43f1c696dd8aeae012d002d499665020 100644 (file)
@@ -2940,7 +2940,7 @@ static int wpa_supplicant_ctrl_iface_update_network(
 static int wpa_supplicant_ctrl_iface_set_network(
        struct wpa_supplicant *wpa_s, char *cmd)
 {
-       int id, ret, prev_bssid_set;
+       int id, ret, prev_bssid_set, prev_disabled;
        struct wpa_ssid *ssid;
        char *name, *value;
        u8 prev_bssid[ETH_ALEN];
@@ -2970,6 +2970,7 @@ static int wpa_supplicant_ctrl_iface_set_network(
        }
 
        prev_bssid_set = ssid->bssid_set;
+       prev_disabled = ssid->disabled;
        os_memcpy(prev_bssid, ssid->bssid, ETH_ALEN);
        ret = wpa_supplicant_ctrl_iface_update_network(wpa_s, ssid, name,
                                                       value);
@@ -2977,6 +2978,11 @@ static int wpa_supplicant_ctrl_iface_set_network(
            (ssid->bssid_set != prev_bssid_set ||
             os_memcmp(ssid->bssid, prev_bssid, ETH_ALEN) != 0))
                wpas_notify_network_bssid_set_changed(wpa_s, ssid);
+
+       if (prev_disabled != ssid->disabled &&
+           (prev_disabled == 2 || ssid->disabled == 2))
+               wpas_notify_network_type_changed(wpa_s, ssid);
+
        return ret;
 }
 
index bf1836a5c320c2ca57dcbc7f73e9b7af2a613a10..ea7dbdb15bf2475770d67242402ea46e5116201b 100644 (file)
@@ -764,3 +764,22 @@ void wpas_notify_network_bssid_set_changed(struct wpa_supplicant *wpa_s,
        wpa_drv_roaming(wpa_s, !ssid->bssid_set,
                        ssid->bssid_set ? ssid->bssid : NULL);
 }
+
+
+void wpas_notify_network_type_changed(struct wpa_supplicant *wpa_s,
+                                     struct wpa_ssid *ssid)
+{
+#ifdef CONFIG_P2P
+       if (ssid->disabled == 2) {
+               /* Changed from normal network profile to persistent group */
+               ssid->disabled = 0;
+               wpas_dbus_unregister_network(wpa_s, ssid->id);
+               ssid->disabled = 2;
+               wpas_dbus_register_persistent_group(wpa_s, ssid);
+       } else {
+               /* Changed from persistent group to normal network profile */
+               wpas_dbus_unregister_persistent_group(wpa_s, ssid->id);
+               wpas_dbus_register_network(wpa_s, ssid);
+       }
+#endif /* CONFIG_P2P */
+}
index 7fb1f58effec5911daeec41751d674bf1ca08926..b268332ffc3361e3d64ff7a22c47f2ddacb1fec6 100644 (file)
@@ -131,5 +131,7 @@ void wpas_notify_eap_status(struct wpa_supplicant *wpa_s, const char *status,
                            const char *parameter);
 void wpas_notify_network_bssid_set_changed(struct wpa_supplicant *wpa_s,
                                           struct wpa_ssid *ssid);
+void wpas_notify_network_type_changed(struct wpa_supplicant *wpa_s,
+                                     struct wpa_ssid *ssid);
 
 #endif /* NOTIFY_H */