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