wifi: The remove interface callback used stale pointer.
authorJukka Rissanen <jukka.rissanen@linux.intel.com>
Fri, 25 Nov 2011 15:06:16 +0000 (17:06 +0200)
committerSamuel Ortiz <sameo@linux.intel.com>
Mon, 28 Nov 2011 16:55:13 +0000 (17:55 +0100)
When a wlan interface is removed we call proper method in
supplicant dbus interface. As the return message from supplicant
might come very late, we must not use the wifi pointer as
user data in interface remove callback. This is because the wifi
pointer might be removed before the answer comes from supplicant and
the callback user data pointer would not be valid at that point.

plugins/wifi.c

index 2fe1479..2070bb9 100644 (file)
@@ -219,7 +219,9 @@ static void interface_remove_callback(int result,
                                        GSupplicantInterface *interface,
                                                        void *user_data)
 {
-       struct wifi_data *wifi = user_data;
+       struct wifi_data *wifi;
+
+       wifi = g_supplicant_interface_get_data(interface);
 
        DBG("result %d wifi %p", result, wifi);
 
@@ -265,7 +267,7 @@ static int wifi_disable(struct connman_device *device)
 
        ret = g_supplicant_interface_remove(wifi->interface,
                                                interface_remove_callback,
-                                                       wifi);
+                                               NULL);
        if (ret < 0)
                return ret;