From: Patrik Flykt <[email protected]>

Interface create and remove callbacks can be called with wifi user data
set to NULL, add checks for this.

When starting to scan, up the reference count on struct connman_device
and release it in the scan callback. Do the same for struct
connman_network in network connect and connect_callback.
---
 plugins/wifi.c |   27 ++++++++++++++++++++-------
 1 files changed, 20 insertions(+), 7 deletions(-)

diff --git a/plugins/wifi.c b/plugins/wifi.c
index f3ea836..92fcd37 100644
--- a/plugins/wifi.c
+++ b/plugins/wifi.c
@@ -200,10 +200,11 @@ static void interface_create_callback(int result,
 {
        struct wifi_data *wifi = user_data;
 
-       DBG("result %d ifname %s", result,
-                               g_supplicant_interface_get_ifname(interface));
+       DBG("result %d ifname %s, wifi %p", result,
+                               g_supplicant_interface_get_ifname(interface),
+                               wifi);
 
-       if (result < 0)
+       if (result < 0 || wifi == NULL)
                return;
 
        wifi->interface = interface;
@@ -216,9 +217,9 @@ static void interface_remove_callback(int result,
 {
        struct wifi_data *wifi = user_data;
 
-       DBG("result %d", result);
+       DBG("result %d wifi %p", result, wifi);
 
-       if (result < 0)
+       if (result < 0 || wifi == NULL)
                return;
 
        wifi->interface = NULL;
@@ -253,8 +254,10 @@ static int wifi_disable(struct connman_device *device)
        wifi->connected = FALSE;
        wifi->disconnecting = FALSE;
 
-       if (wifi->pending_network != NULL)
+       if (wifi->pending_network != NULL) {
+               connman_network_unref(wifi->pending_network);
                wifi->pending_network = NULL;
+       }
 
        remove_networks(device, wifi);
 
@@ -278,6 +281,7 @@ static void scan_callback(int result, GSupplicantInterface 
*interface,
                connman_device_reset_scanning(device);
        else
                connman_device_set_scanning(device, FALSE);
+       connman_device_unref(device);
 }
 
 static int wifi_scan(struct connman_device *device)
@@ -290,10 +294,13 @@ static int wifi_scan(struct connman_device *device)
        if (wifi->tethering == TRUE)
                return 0;
 
+       connman_device_ref(device);
        ret = g_supplicant_interface_scan(wifi->interface, scan_callback,
                                                                device);
        if (ret == 0)
                connman_device_set_scanning(device, TRUE);
+       else
+               connman_device_unref(device);
 
        return ret;
 }
@@ -362,6 +369,7 @@ static void connect_callback(int result, 
GSupplicantInterface *interface,
                connman_network_set_error(network,
                                        CONNMAN_NETWORK_ERROR_CONFIGURE_FAIL);
        }
+       connman_network_unref(network);
 }
 
 static GSupplicantSecurity network_security(const char *security)
@@ -450,6 +458,7 @@ static int network_connect(struct connman_network *network)
        struct wifi_data *wifi;
        GSupplicantInterface *interface;
        GSupplicantSSID *ssid;
+       int err;
 
        DBG("network %p", network);
 
@@ -468,13 +477,16 @@ static int network_connect(struct connman_network 
*network)
 
        ssid_init(ssid, network);
 
+       connman_network_ref(network);
        if (wifi->disconnecting == TRUE)
                wifi->pending_network = network;
        else {
                wifi->network = network;
 
-               return g_supplicant_interface_connect(interface, ssid,
+               err = g_supplicant_interface_connect(interface, ssid,
                                                connect_callback, network);
+               if (err != -EINPROGRESS)
+                       connman_network_unref(network);
        }
 
        return -EINPROGRESS;
@@ -503,6 +515,7 @@ static void disconnect_callback(int result, 
GSupplicantInterface *interface,
 
        if (wifi->pending_network != NULL) {
                network_connect(wifi->pending_network);
+               connman_network_unref(wifi->pending_network);
                wifi->pending_network = NULL;
        }
 
-- 
1.7.2.5

_______________________________________________
connman mailing list
[email protected]
http://lists.connman.net/listinfo/connman

Reply via email to