callback_interface_removed(interface);
g_free(interface->path);
+ g_free(interface->network_path);
g_free(interface->ifname);
g_free(interface->driver);
g_free(interface->bridge);
g_hash_table_destroy(network->config_table);
+ g_free(network->path);
g_free(network->group);
g_free(network->name);
g_free(network);
key, dbus_message_iter_get_arg_type(iter));
}
-static void interface_bss_added(DBusMessageIter *iter, void *user_data)
+static struct g_supplicant_bss *interface_bss_added(DBusMessageIter *iter,
+ void *user_data)
{
GSupplicantInterface *interface = user_data;
GSupplicantNetwork *network;
dbus_message_iter_get_basic(iter, &path);
if (path == NULL)
- return;
+ return NULL;
if (g_strcmp0(path, "/") == 0)
- return;
+ return NULL;
SUPPLICANT_DBG("%s", path);
if (network != NULL) {
bss = g_hash_table_lookup(network->bss_table, path);
if (bss != NULL)
- return;
+ return NULL;
}
bss = g_try_new0(struct g_supplicant_bss, 1);
if (bss == NULL)
- return;
+ return NULL;
bss->interface = interface;
bss->path = g_strdup(path);
+ return bss;
+}
+
+static void interface_bss_added_with_keys(DBusMessageIter *iter,
+ void *user_data)
+{
+ struct g_supplicant_bss *bss;
+
+ SUPPLICANT_DBG("");
+
+ bss = interface_bss_added(iter, user_data);
+ if (bss == NULL)
+ return;
+
dbus_message_iter_next(iter);
- if (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_INVALID) {
- supplicant_dbus_property_foreach(iter, bss_property, bss);
- bss_property(NULL, NULL, bss);
+
+ if (dbus_message_iter_get_arg_type(iter) == DBUS_TYPE_INVALID)
return;
- }
- supplicant_dbus_property_get_all(path,
+ supplicant_dbus_property_foreach(iter, bss_property, bss);
+ bss_property(NULL, NULL, bss);
+}
+
+static void interface_bss_added_without_keys(DBusMessageIter *iter,
+ void *user_data)
+{
+ struct g_supplicant_bss *bss;
+
+ SUPPLICANT_DBG("");
+
+ bss = interface_bss_added(iter, user_data);
+ if (bss == NULL)
+ return;
+
+ supplicant_dbus_property_get_all(bss->path,
SUPPLICANT_INTERFACE ".BSS",
bss_property, bss);
}
const char *str = NULL;
dbus_message_iter_get_basic(iter, &str);
- if (str != NULL)
+ if (str != NULL) {
+ g_free(interface->ifname);
interface->ifname = g_strdup(str);
+ }
} else if (g_strcmp0(key, "Driver") == 0) {
const char *str = NULL;
dbus_message_iter_get_basic(iter, &str);
- if (str != NULL)
+ if (str != NULL) {
+ g_free(interface->driver);
interface->driver = g_strdup(str);
+ }
} else if (g_strcmp0(key, "BridgeIfname") == 0) {
const char *str = NULL;
dbus_message_iter_get_basic(iter, &str);
- if (str != NULL)
+ if (str != NULL) {
+ g_free(interface->bridge);
interface->bridge = g_strdup(str);
+ }
} else if (g_strcmp0(key, "CurrentBSS") == 0) {
- interface_bss_added(iter, interface);
+ interface_bss_added_without_keys(iter, interface);
} else if (g_strcmp0(key, "CurrentNetwork") == 0) {
interface_network_added(iter, interface);
} else if (g_strcmp0(key, "BSSs") == 0) {
- supplicant_dbus_array_foreach(iter, interface_bss_added,
+ supplicant_dbus_array_foreach(iter, interface_bss_added_without_keys,
interface);
} else if (g_strcmp0(key, "Blobs") == 0) {
/* Nothing */
if (interface == NULL)
return;
- interface_bss_added(iter, interface);
+ interface_bss_added_with_keys(iter, interface);
}
static void signal_bss_removed(const char *path, DBusMessageIter *iter)
goto done;
}
- g_hash_table_remove(interface_table, data->interface->path);
+ /*
+ * The gsupplicant interface is already freed by the InterfaceRemoved
+ * signal callback. Simply invoke the interface_data callback.
+ */
err = 0;
done:
if (data->callback != NULL)
- data->callback(err, data->interface, data->user_data);
+ data->callback(err, NULL, data->user_data);
dbus_free(data);
}
SUPPLICANT_DBG("");
+ g_free(data->ssid);
dbus_free(data);
}
error:
g_free(interface->network_path);
interface->network_path = NULL;
+ g_free(data->ssid);
g_free(data);
}
}
- phase2_auth = g_strdup_printf("\"auth=%s\"", ssid->phase2_auth);
+ phase2_auth = g_strdup_printf("auth=%s", ssid->phase2_auth);
supplicant_dbus_dict_append_basic(dict, "password",
DBUS_TYPE_STRING,
supplicant_dbus_dict_append_basic(dict, "phase2",
DBUS_TYPE_STRING,
- &ssid->phase2_auth);
+ &phase2_auth);
g_free(phase2_auth);
}
bss_mapping = NULL;
}
+ if (system_available == TRUE)
+ callback_system_killed();
+
if (interface_table != NULL) {
g_hash_table_foreach(interface_table,
unregister_remove_interface, NULL);
interface_table = NULL;
}
- if (system_available == TRUE)
- callback_system_killed();
-
if (connection != NULL) {
dbus_connection_unref(connection);
connection = NULL;