From c5190d319e72e0d27a37242033ac0a59806015d5 Mon Sep 17 00:00:00 2001 From: Bastien Nocera Date: Fri, 16 Feb 2018 10:58:22 +0100 Subject: lib: Fix possible crash on startup Fix possible crash when the object creation is cancelled on startup. We shouldn't be using user_data until we know that the call has not been cancelled, otherwise we could be accessing already freed memory. #0 g_type_check_instance_cast (type_instance=type_instance@entry=0x208dc60, iface_type=34189312) at /home/hadess/Projects/jhbuild/glib/gobject/gtype.c:4057 #1 0x00007f34c8d09522 in object_manager_new_callback (source_object=, res=0x208c390, user_data=user_data@entry=0x208dc60) at ../../../../Projects/jhbuild/gnome-bluetooth/lib/bluetooth-client.c:761 #2 0x00007f34ce7d819a in g_task_return_now (task=0x208c390) at /home/hadess/Projects/jhbuild/glib/gio/gtask.c:1148 #3 0x00007f34ce7d81d9 in complete_in_idle_cb (task=task@entry=0x208c390) at /home/hadess/Projects/jhbuild/glib/gio/gtask.c:1162 https://bugzilla.gnome.org/show_bug.cgi?id=793505 --- lib/bluetooth-client.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/lib/bluetooth-client.c b/lib/bluetooth-client.c index 0233537e..2a8db62f 100644 --- a/lib/bluetooth-client.c +++ b/lib/bluetooth-client.c @@ -758,18 +758,24 @@ object_manager_new_callback(GObject *source_object, GAsyncResult *res, void *user_data) { - BluetoothClient *client = BLUETOOTH_CLIENT (user_data); - BluetoothClientPrivate *priv = BLUETOOTH_CLIENT_GET_PRIVATE(client); + BluetoothClient *client; + BluetoothClientPrivate *priv; + GDBusObjectManager *manager; GList *object_list, *l; GError *error = NULL; - priv->manager = g_dbus_object_manager_client_new_for_bus_finish (res, &error); - if (error) { - g_warning ("Could not create bluez object manager: %s", error->message); + manager = g_dbus_object_manager_client_new_for_bus_finish (res, &error); + if (!manager) { + if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) + g_warning ("Could not create bluez object manager: %s", error->message); g_error_free (error); return; } + client = BLUETOOTH_CLIENT (user_data); + priv = BLUETOOTH_CLIENT_GET_PRIVATE(client); + priv->manager = manager; + g_signal_connect (G_OBJECT (priv->manager), "interface-added", (GCallback) interface_added, client); g_signal_connect (G_OBJECT (priv->manager), "interface-removed", (GCallback) interface_removed, client); -- cgit v1.2.1