gsupplicant: Only add interface when wpa_supplicant is in ready state 76/8276/3
authorJukka Rissanen <jukka.rissanen@linux.intel.com>
Thu, 25 Jul 2013 13:31:27 +0000 (16:31 +0300)
committerZhang zhengguang <zhengguang.zhang@intel.com>
Thu, 15 Aug 2013 01:08:40 +0000 (09:08 +0800)
I noticed following scenario:
- hardblock the device
- turn on offline mode
- turn off hardblock, as offline mode is still on connman will
  set softblock on
- wpa_supplicant generated these state signals in this order:
     1. INACTIVE
     2. DISABLED
- wifi.c cannot handle these events because the wifi pointer
  is NULL at this point
- gsupplicant will then call wifi.c:interface_added(), this will cause
  the scanning to start but that will fail because we are still
  in softblocked state (wpa_supplicant returns error)
- wifi.c goes now to forever loop i.e., it tries to start scan
  constantly. Only way to recover is to unblock wifi by turning
  offline mode off.

The fix to this issue is simple, if the interface is not yet ready
then gsupplicant will not call wifi.c:interface_added() callback as
that is useless anyway.

Upstream commit id:70445458847721186622677e2810febbf2f2f454

gsupplicant/supplicant.c

index db13ed6..a660b8d 100644 (file)
@@ -1729,7 +1729,9 @@ static void interface_property(const char *key, DBusMessageIter *iter,
                debug_strvalmap("Mode capability", mode_capa_map,
                                                interface->mode_capa);
 
-               callback_interface_added(interface);
+               if (interface->ready)
+                       callback_interface_added(interface);
+
                return;
        }