From 73e752835043e9dcbd428bbad3b0257ed71c1bb0 Mon Sep 17 00:00:00 2001 From: Dan Williams Date: Wed, 23 Jun 2010 14:17:52 -0700 Subject: [PATCH] vpn: ensure the IP interface passed to the dispatcher is the tunnel iface priv->ip_iface gets destroyed in vpn_cleanup() when the class signal handler handles FAILED/DISCONNECTED, but the dispatcher is only called *after* that, so it gets a NULL ip_iface. Fix that so that the dispatcher always gets the tunnel interface for vpn-up and vpn-down. --- src/vpn-manager/nm-vpn-connection.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/vpn-manager/nm-vpn-connection.c b/src/vpn-manager/nm-vpn-connection.c index 91c7754265..7eae972e8a 100644 --- a/src/vpn-manager/nm-vpn-connection.c +++ b/src/vpn-manager/nm-vpn-connection.c @@ -119,6 +119,7 @@ nm_vpn_connection_set_vpn_state (NMVPNConnection *connection, NMVPNConnectionPrivate *priv; NMActiveConnectionState new_ac_state; NMVPNConnectionState old_vpn_state; + char *ip_iface; g_return_if_fail (NM_IS_VPN_CONNECTION (connection)); @@ -130,6 +131,11 @@ nm_vpn_connection_set_vpn_state (NMVPNConnection *connection, old_vpn_state = priv->vpn_state; priv->vpn_state = vpn_state; + /* Save ip_iface since when the VPN goes down it may get freed + * before we're done with it. + */ + ip_iface = g_strdup (priv->tundev); + /* Set the NMActiveConnection state based on VPN state */ switch (vpn_state) { case NM_VPN_CONNECTION_STATE_PREPARE: @@ -166,7 +172,7 @@ nm_vpn_connection_set_vpn_state (NMVPNConnection *connection, nm_utils_call_dispatcher ("vpn-up", priv->connection, priv->parent_dev, - priv->tundev); + ip_iface); break; case NM_VPN_CONNECTION_STATE_FAILED: case NM_VPN_CONNECTION_STATE_DISCONNECTED: @@ -174,13 +180,14 @@ nm_vpn_connection_set_vpn_state (NMVPNConnection *connection, nm_utils_call_dispatcher ("vpn-down", priv->connection, priv->parent_dev, - priv->tundev); + ip_iface); } break; default: break; } + g_free (ip_iface); g_object_unref (connection); }