79 lines
3.4 KiB
Diff
79 lines
3.4 KiB
Diff
|
From b4f7cca1a3ee02d86ceec4fcea51a9ed349248b6 Mon Sep 17 00:00:00 2001
|
||
|
From: Iain Lane <iain@orangesquash.org.uk>
|
||
|
Date: Fri, 22 Sep 2017 11:48:05 +0100
|
||
|
Subject: [PATCH 2/3] {vpn,remote}-connection: disconnect signal handlers when
|
||
|
disposed
|
||
|
|
||
|
GNOME Settings 3.26 is crashing every time a VPN connection changed its
|
||
|
state. After some digging, a debug message was put on dispose, and this
|
||
|
issue was found:
|
||
|
|
||
|
libnm-Message: Object 0x55555633c070 disposed
|
||
|
libnm-Message: Object 0x55555633c730 disposed
|
||
|
libnm-Message: Object 0x55555633eae0 disposed
|
||
|
libnm-Message: Object 0x555556340a80 disposed
|
||
|
|
||
|
Thread 1 "gnome-control-c" received signal SIGSEGV, Segmentation fault.
|
||
|
g_type_check_instance_cast (type_instance=type_instance@entry=0x55555633c070, iface_type=93825006537856) at /.../glib/gobject/gtype.c:4057
|
||
|
4057 node = lookup_type_node_I (type_instance->g_class->g_type);
|
||
|
(gdb) bt
|
||
|
|
||
|
NetworkManager is calling callbacks on disposed objects, which leads to
|
||
|
crashes in clients (e.g. GNOME Settings).
|
||
|
|
||
|
Fix this issue by disconnecting signal handlers when the objects are
|
||
|
disposed.
|
||
|
|
||
|
Patch originally by Georges Basile Stavracas Neto <georges.stavracas@gmail.com>
|
||
|
|
||
|
https://bugzilla.gnome.org/show_bug.cgi?id=787893
|
||
|
(cherry picked from commit b18896f77048399e7a8b6ddd4fa0961e603836fa)
|
||
|
(cherry picked from commit b363a6cfad5996b5436b6f7c1d9337068fcb4c99)
|
||
|
---
|
||
|
libnm/nm-remote-connection.c | 6 +++---
|
||
|
libnm/nm-vpn-connection.c | 4 ++--
|
||
|
2 files changed, 5 insertions(+), 5 deletions(-)
|
||
|
|
||
|
diff --git a/libnm/nm-remote-connection.c b/libnm/nm-remote-connection.c
|
||
|
index 0f7ea58ef..5cd42555f 100644
|
||
|
--- a/libnm/nm-remote-connection.c
|
||
|
+++ b/libnm/nm-remote-connection.c
|
||
|
@@ -641,7 +641,7 @@ init_sync (GInitable *initable, GCancellable *cancellable, GError **error)
|
||
|
GVariant *settings;
|
||
|
|
||
|
priv->proxy = NMDBUS_SETTINGS_CONNECTION (_nm_object_get_proxy (NM_OBJECT (initable), NM_DBUS_INTERFACE_SETTINGS_CONNECTION));
|
||
|
- g_signal_connect (priv->proxy, "updated", G_CALLBACK (updated_cb), initable);
|
||
|
+ g_signal_connect_object (priv->proxy, "updated", G_CALLBACK (updated_cb), initable, 0);
|
||
|
|
||
|
if (nmdbus_settings_connection_call_get_settings_sync (priv->proxy,
|
||
|
&settings,
|
||
|
@@ -730,8 +730,8 @@ init_async (GAsyncInitable *initable, int io_priority,
|
||
|
priv->proxy = NMDBUS_SETTINGS_CONNECTION (_nm_object_get_proxy (NM_OBJECT (initable),
|
||
|
NM_DBUS_INTERFACE_SETTINGS_CONNECTION));
|
||
|
|
||
|
- g_signal_connect (priv->proxy, "updated",
|
||
|
- G_CALLBACK (updated_cb), initable);
|
||
|
+ g_signal_connect_object (priv->proxy, "updated",
|
||
|
+ G_CALLBACK (updated_cb), initable, 0);
|
||
|
|
||
|
nmdbus_settings_connection_call_get_settings (NM_REMOTE_CONNECTION_GET_PRIVATE (init_data->initable)->proxy,
|
||
|
init_data->cancellable,
|
||
|
diff --git a/libnm/nm-vpn-connection.c b/libnm/nm-vpn-connection.c
|
||
|
index 814f45f0f..636c39507 100644
|
||
|
--- a/libnm/nm-vpn-connection.c
|
||
|
+++ b/libnm/nm-vpn-connection.c
|
||
|
@@ -144,8 +144,8 @@ init_dbus (NMObject *object)
|
||
|
property_info);
|
||
|
|
||
|
proxy = _nm_object_get_proxy (object, NM_DBUS_INTERFACE_VPN_CONNECTION);
|
||
|
- g_signal_connect (proxy, "vpn-state-changed",
|
||
|
- G_CALLBACK (vpn_state_changed_proxy), object);
|
||
|
+ g_signal_connect_object (proxy, "vpn-state-changed",
|
||
|
+ G_CALLBACK (vpn_state_changed_proxy), object, 0);
|
||
|
g_object_unref (proxy);
|
||
|
}
|
||
|
|
||
|
--
|
||
|
2.13.6
|
||
|
|