[gnome-bluetooth/gnome-3-32] client: Disconnect all signal handlers when client is disposed



commit b20b351f40a2328815f6dccda82caaf705efb93b
Author: Simon McVittie <smcv debian org>
Date:   Tue Aug 13 15:53:49 2019 +0100

    client: Disconnect all signal handlers when client is disposed
    
    I've encountered an intermittent GNOME Shell crash when needrestart[1]
    is allowed to restart system services that are using outdated shared
    libraries, which sometimes includes BlueZ. The crash seems to involve
    signals being delivered to a freed BluetoothClient, which can be avoided
    by using g_signal_connect_object(). I haven't encountered the crash
    since applying this change, although since it was always intermittent
    I cannot be sure that it is fully solved.
    
    This might be caused by using the Bluetooth Quick Connect shell
    extension[2], which will create and destroy a BluetoothClient when the
    extension is loaded and unloaded, which will in turn happen when the
    screen is locked (due to extensions being disabled in the lock screen).
    
    [1] https://github.com/liske/needrestart
    [2] https://extensions.gnome.org/extension/1401/bluetooth-quick-connect/
    
    Signed-off-by: Simon McVittie <smcv debian org>
    Bug-Debian: https://bugs.debian.org/932405

 lib/bluetooth-client.c | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)
---
diff --git a/lib/bluetooth-client.c b/lib/bluetooth-client.c
index bb4dc3ea..089fbb5f 100644
--- a/lib/bluetooth-client.c
+++ b/lib/bluetooth-client.c
@@ -392,8 +392,8 @@ device_added (GDBusObjectManager   *manager,
        BluetoothType type;
        GtkTreeIter iter, parent;
 
-       g_signal_connect (G_OBJECT (device), "notify",
-                         G_CALLBACK (device_notify_cb), client);
+       g_signal_connect_object (G_OBJECT (device), "notify",
+                                G_CALLBACK (device_notify_cb), client, 0);
 
        adapter_path = device1_get_adapter (device);
        address = device1_get_address (device);
@@ -608,8 +608,8 @@ adapter_added (GDBusObjectManager   *manager,
        const gchar *address, *name;
        gboolean discovering, discoverable, powered;
 
-       g_signal_connect (G_OBJECT (adapter), "notify",
-                         G_CALLBACK (adapter_notify_cb), client);
+       g_signal_connect_object (G_OBJECT (adapter), "notify",
+                                G_CALLBACK (adapter_notify_cb), client, 0);
 
        address = adapter1_get_address (adapter);
        name = adapter1_get_name (adapter);
@@ -798,11 +798,11 @@ object_manager_new_callback(GObject      *source_object,
        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);
+       g_signal_connect_object (G_OBJECT (priv->manager), "interface-added", (GCallback) interface_added, 
client, 0);
+       g_signal_connect_object (G_OBJECT (priv->manager), "interface-removed", (GCallback) 
interface_removed, client, 0);
 
-       g_signal_connect (G_OBJECT (priv->manager), "object-added", (GCallback) object_added, client);
-       g_signal_connect (G_OBJECT (priv->manager), "object-removed", (GCallback) object_removed, client);
+       g_signal_connect_object (G_OBJECT (priv->manager), "object-added", (GCallback) object_added, client, 
0);
+       g_signal_connect_object (G_OBJECT (priv->manager), "object-removed", (GCallback) object_removed, 
client, 0);
 
        object_list = g_dbus_object_manager_get_objects (priv->manager);
 


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