diff options
author | Arman Uguray <armansito@chromium.org> | 2015-02-20 17:56:47 -0800 |
---|---|---|
committer | Luiz Augusto von Dentz <luiz.von.dentz@intel.com> | 2015-02-22 13:02:32 +0200 |
commit | 2cd4c008b08a0bb8f504b4c0d49a65c02840cd9e (patch) | |
tree | fd52db3f2b6cbc5232046becf32c6b1381071071 /gdbus | |
parent | 6d14672eb38029d0ea79b7382837d71ba56dbcee (diff) | |
download | bluez-2cd4c008b08a0bb8f504b4c0d49a65c02840cd9e.tar.gz |
gdbus: Don't refresh objects/props if disconnected
If g_dbus_client_set_proxy_handlers gets called from within a
proxy_removed callback, the code may end up refreshing the proxy's
properties and incorrectly access the client's proxy_list as it gets
freed. This patch fixes this, so that get_managed_objects does nothing
if it gets called during a service disconnect.
Diffstat (limited to 'gdbus')
-rw-r--r-- | gdbus/client.c | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/gdbus/client.c b/gdbus/client.c index eb68a0f82..238b34828 100644 --- a/gdbus/client.c +++ b/gdbus/client.c @@ -1107,6 +1107,9 @@ static void get_managed_objects(GDBusClient *client) { DBusMessage *msg; + if (!client->connected) + return; + if (!client->proxy_added && !client->proxy_removed) { refresh_properties(client); return; @@ -1142,13 +1145,13 @@ static void service_connect(DBusConnection *conn, void *user_data) g_dbus_client_ref(client); + client->connected = TRUE; + if (client->connect_func) client->connect_func(conn, client->connect_data); get_managed_objects(client); - client->connected = TRUE; - g_dbus_client_unref(client); } @@ -1156,13 +1159,13 @@ static void service_disconnect(DBusConnection *conn, void *user_data) { GDBusClient *client = user_data; + client->connected = FALSE; + g_list_free_full(client->proxy_list, proxy_free); client->proxy_list = NULL; - if (client->disconn_func) { + if (client->disconn_func) client->disconn_func(conn, client->disconn_data); - client->connected = FALSE; - } } static DBusHandlerResult message_filter(DBusConnection *connection, |