summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon McVittie <smcv@debian.org>2019-08-13 15:53:49 +0100
committerBastien Nocera <hadess@hadess.net>2019-09-03 16:38:28 +0200
commitb20b351f40a2328815f6dccda82caaf705efb93b (patch)
tree5becb69d396f47735b796fcb7e3a0027dee9bb3a
parent294f6942bdcf6ddfd733ce560f9ab24a4598e3ad (diff)
downloadgnome-bluetooth-gnome-3-32.tar.gz
client: Disconnect all signal handlers when client is disposedgnome-3-32
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
-rw-r--r--lib/bluetooth-client.c16
1 files 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);