[gnome-bluetooth] lib: Fix possible crash on startup



commit c5190d319e72e0d27a37242033ac0a59806015d5
Author: Bastien Nocera <hadess hadess net>
Date:   Fri Feb 16 10:58:22 2018 +0100

    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

 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 0233537..2a8db62 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);
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]