diff options
author | Bastien Nocera <hadess@hadess.net> | 2018-02-16 10:58:22 +0100 |
---|---|---|
committer | Bastien Nocera <hadess@hadess.net> | 2018-02-16 11:55:08 +0100 |
commit | c5190d319e72e0d27a37242033ac0a59806015d5 (patch) | |
tree | 3a610420bb849c6c0fbd8316d8c19a1f6c3c2302 | |
parent | 86574feca8f33aa173cd9b0558c52d4fafb8320b (diff) | |
download | gnome-bluetooth-c5190d319e72e0d27a37242033ac0a59806015d5.tar.gz |
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=<optimized out>, 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
-rw-r--r-- | lib/bluetooth-client.c | 16 |
1 files 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); |