summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBastien Nocera <hadess@hadess.net>2018-02-16 10:58:22 +0100
committerBastien Nocera <hadess@hadess.net>2018-02-16 11:55:08 +0100
commitc5190d319e72e0d27a37242033ac0a59806015d5 (patch)
tree3a610420bb849c6c0fbd8316d8c19a1f6c3c2302
parent86574feca8f33aa173cd9b0558c52d4fafb8320b (diff)
downloadgnome-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.c16
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);