At the time we detect p2p support, interface might not be related to any
wifi plugin structure. When this was not a problem before, it becomes
one now that peer_service.c is in use: as soon as the peer driver is
set, it will try to register all existing peer services to the
interfaces, and without any relation wifi<->interface, this was
generating a crash bug. This patch prevent this as it calls the p2p
support callback always after interface_create_callback() has been
called: this one sets the relation between wifi and interface.
---
gsupplicant/supplicant.c | 25 +++++++++----------------
1 file changed, 9 insertions(+), 16 deletions(-)
diff --git a/gsupplicant/supplicant.c b/gsupplicant/supplicant.c
index 475a131..b35ea5f 100644
--- a/gsupplicant/supplicant.c
+++ b/gsupplicant/supplicant.c
@@ -157,7 +157,6 @@ struct _GSupplicantInterface {
unsigned int scan_capa;
unsigned int mode_capa;
unsigned int max_scan_ssids;
- bool p2p_checked;
bool p2p_support;
bool p2p_finding;
dbus_bool_t ready;
@@ -409,11 +408,9 @@ static void callback_p2p_support(GSupplicantInterface
*interface)
{
SUPPLICANT_DBG("");
- if (interface->p2p_checked)
+ if (!interface->p2p_support)
return;
- interface->p2p_checked = true;
-
if (callbacks_pointer && callbacks_pointer->p2p_support)
callbacks_pointer->p2p_support(interface);
}
@@ -1890,15 +1887,6 @@ static void interface_bss_removed(DBusMessageIter *iter,
void *user_data)
g_hash_table_remove(interface->network_table, network->group);
}
-static void interface_detect_p2p_support(GSupplicantInterface *interface)
-{
- SUPPLICANT_DBG("p2p detect");
- if (interface->mode_capa & G_SUPPLICANT_CAPABILITY_MODE_P2P) {
- interface->p2p_support = true;
- callback_p2p_support(interface);
- }
-}
-
static void interface_property(const char *key, DBusMessageIter *iter,
void *user_data)
{
@@ -1934,7 +1922,8 @@ static void interface_property(const char *key,
DBusMessageIter *iter,
if (g_strcmp0(key, "Capabilities") == 0) {
supplicant_dbus_property_foreach(iter, interface_capability,
interface);
- interface_detect_p2p_support(interface);
+ if (interface->mode_capa & G_SUPPLICANT_CAPABILITY_MODE_P2P)
+ interface->p2p_support = true;
} else if (g_strcmp0(key, "State") == 0) {
const char *str = NULL;
@@ -3302,8 +3291,10 @@ static void interface_create_property(const char *key,
DBusMessageIter *iter,
GSupplicantInterface *interface = data->interface;
if (!key) {
- if (data->callback)
+ if (data->callback) {
data->callback(0, data->interface, data->user_data);
+ callback_p2p_support(interface);
+ }
interface_create_data_free(data);
}
@@ -3410,8 +3401,10 @@ static void interface_get_result(const char *error,
goto done;
}
- if (data->callback)
+ if (data->callback) {
data->callback(0, interface, data->user_data);
+ callback_p2p_support(interface);
+ }
interface_create_data_free(data);
--
1.8.5.5
_______________________________________________
connman mailing list
[email protected]
https://lists.connman.net/mailman/listinfo/connman