1
From b613a1777b97c646c13edbca277981f788a3462b Mon Sep 17 00:00:00 2001
2
From: Mathieu Trudel-Lapierre <mathieu.trudel-lapierre@canonical.com>
3
Date: Wed, 13 Apr 2011 20:20:38 +0000
4
Subject: core: disconnect signals from VPN connection objects when quitting (lp:737713)
6
A copy & paste error in the VPN connection code meant the VPN
7
connection was canceling secrets requests for the underlying
8
device's activation request, not the VPN connection's requests.
9
Fix that, and as an additional measure, ensure that the manager
10
removes signal handlers when it gets destroyed that it registered
11
earlier, preventing those handlers from getting called by the
12
VPN connection after the manager is dead. That can happen because
13
the VPN manager holds references to the VPN connection objects,
14
and the VPN manager gets destroyed after the NMManager does.
16
This caused a crash when exiting NM when a VPN connection was active.
20
Index: network-manager-0.8.4~git.20110319t175609.d14809b/src/nm-manager.c
21
===================================================================
22
--- network-manager-0.8.4~git.20110319t175609.d14809b.orig/src/nm-manager.c 2011-04-14 14:52:36.371306536 -0400
23
+++ network-manager-0.8.4~git.20110319t175609.d14809b/src/nm-manager.c 2011-04-14 14:53:26.671306515 -0400
26
NMManager *manager = NM_MANAGER (object);
27
NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (manager);
29
+ GSList *iter, *list;
31
DBusConnection *dbus_connection;
33
@@ -4395,6 +4395,22 @@
34
priv->sys_settings = NULL;
37
+ /* Make sure we disconnect signal handlers from VPN connections that
38
+ * might still be alive when the manager dies.
40
+ list = nm_vpn_manager_get_active_connections (priv->vpn_manager);
41
+ for (iter = list; iter; iter = g_slist_next (iter)) {
42
+ NMActRequest *req = nm_vpn_connection_get_act_request (NM_VPN_CONNECTION (iter->data));
43
+ g_signal_handlers_disconnect_by_func (G_OBJECT (req),
44
+ G_CALLBACK (provider_get_secrets),
46
+ g_signal_handlers_disconnect_by_func (G_OBJECT (req),
47
+ G_CALLBACK (provider_cancel_secrets),
49
+ nm_log_warn (LOGD_CORE, "disposing of VPN connection '%s'", nm_vpn_connection_get_name (NM_VPN_CONNECTION (iter->data)));
50
+ /* unref to balance returned objects from the VPN manager */
51
+ g_object_unref (iter->data);
53
if (priv->vpn_manager_id) {
54
g_source_remove (priv->vpn_manager_id);
55
priv->vpn_manager_id = 0;
56
Index: network-manager-0.8.4~git.20110319t175609.d14809b/src/vpn-manager/nm-vpn-connection.c
57
===================================================================
58
--- network-manager-0.8.4~git.20110319t175609.d14809b.orig/src/vpn-manager/nm-vpn-connection.c 2011-03-21 22:15:39.000000000 -0400
59
+++ network-manager-0.8.4~git.20110319t175609.d14809b/src/vpn-manager/nm-vpn-connection.c 2011-04-14 14:52:36.441306536 -0400
61
return NM_VPN_CONNECTION_GET_PRIVATE (connection)->connection;
65
+nm_vpn_connection_get_act_request (NMVPNConnection *connection)
67
+ g_return_val_if_fail (NM_IS_VPN_CONNECTION (connection), NULL);
69
+ return NM_VPN_CONNECTION_GET_PRIVATE (connection)->act_request;
73
nm_vpn_connection_get_vpn_state (NMVPNConnection *connection)
75
Index: network-manager-0.8.4~git.20110319t175609.d14809b/src/vpn-manager/nm-vpn-connection.h
76
===================================================================
77
--- network-manager-0.8.4~git.20110319t175609.d14809b.orig/src/vpn-manager/nm-vpn-connection.h 2011-03-21 22:15:39.000000000 -0400
78
+++ network-manager-0.8.4~git.20110319t175609.d14809b/src/vpn-manager/nm-vpn-connection.h 2011-04-14 14:52:36.441306536 -0400
81
void nm_vpn_connection_activate (NMVPNConnection *connection);
82
NMConnection * nm_vpn_connection_get_connection (NMVPNConnection *connection);
83
+NMActRequest * nm_vpn_connection_get_act_request (NMVPNConnection *connection);
84
const char * nm_vpn_connection_get_active_connection_path (NMVPNConnection *connection);
85
const char * nm_vpn_connection_get_name (NMVPNConnection *connection);
86
NMVPNConnectionState nm_vpn_connection_get_vpn_state (NMVPNConnection *connection);