summaryrefslogtreecommitdiffstats
path: root/gdbus
diff options
context:
space:
mode:
authorArman Uguray <armansito@chromium.org>2015-02-20 17:56:47 -0800
committerMarcel Holtmann <marcel@holtmann.org>2015-02-22 19:42:25 +0100
commit8660527b11143f83fc4b4f891fab688996c3ee55 (patch)
treee13806a967ca151755749d04575e2dabfb0dddf7 /gdbus
parentd6bc91ebfc1022bb382b1dc94240b103cfdd6dfd (diff)
downloadofono-8660527b11143f83fc4b4f891fab688996c3ee55.tar.bz2
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.c13
1 files changed, 8 insertions, 5 deletions
diff --git a/gdbus/client.c b/gdbus/client.c
index eb68a0f8..238b3482 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,