summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIain Lane <iain@orangesquash.org.uk>2017-09-22 11:48:05 +0100
committerBeniamino Galvani <bgalvani@redhat.com>2017-09-22 14:16:50 +0200
commitb18896f77048399e7a8b6ddd4fa0961e603836fa (patch)
tree6e424203f2f15432fcb0f88231628c61db575971
parent91fa202379b417f146c9b14be7b9b08d2dc83a78 (diff)
downloadNetworkManager-b18896f77048399e7a8b6ddd4fa0961e603836fa.tar.gz
{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
-rw-r--r--libnm/nm-remote-connection.c6
-rw-r--r--libnm/nm-vpn-connection.c4
2 files changed, 5 insertions, 5 deletions
diff --git a/libnm/nm-remote-connection.c b/libnm/nm-remote-connection.c
index 0f7ea58ef9..5cd42555f5 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 814f45f0f8..636c395078 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);
}