From f72816bf108cf3fa52ae267e3622a1f19db28b21 Mon Sep 17 00:00:00 2001 From: Lubomir Rintel Date: Sun, 3 Apr 2016 13:51:24 +0200 Subject: [PATCH] manager: don't remove the device before policy learns of ip config change First let the device know it's being removed soon so that it has a chance to clean up the IP configuration early. If the manager removes the device fist, the policy never learns of config removal and doesn't unhook it from the DNS manager resulting in a IPConfig leak and possible wrong DNS configuration in effect. Also adjust the route manager to skip over devices without IP configuration when determining the best connection; it is perhaps just due to being removed. https://bugzilla.gnome.org/show_bug.cgi?id=764483 --- src/devices/nm-device.c | 14 ++++++++------ src/nm-default-route-manager.c | 4 +++- src/nm-manager.c | 2 +- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c index 50858333aa..bf7e814739 100644 --- a/src/devices/nm-device.c +++ b/src/devices/nm-device.c @@ -2570,6 +2570,7 @@ void nm_device_removed (NMDevice *self) { NMDevicePrivate *priv; + NMDeviceStateReason ignored = NM_DEVICE_STATE_REASON_NONE; g_return_if_fail (NM_IS_DEVICE (self)); @@ -2579,6 +2580,13 @@ nm_device_removed (NMDevice *self) * Release the slave from master, but don't touch the device. */ nm_device_master_release_one_slave (priv->master, self, FALSE, NM_DEVICE_STATE_REASON_CONNECTION_ASSUMED); } + + /* Clean up IP configs; this does not actually deconfigure the + * interface, it just disowns the configuration so that policy + * unregisters it from the dns manager before the device itself + * is gone from manager. */ + nm_device_set_ip4_config (self, NULL, 0, TRUE, TRUE, &ignored); + nm_device_set_ip6_config (self, NULL, TRUE, TRUE, &ignored); } static gboolean @@ -9971,7 +9979,6 @@ static void _cleanup_generic_post (NMDevice *self, CleanupType cleanup_type) { NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self); - NMDeviceStateReason ignored = NM_DEVICE_STATE_REASON_NONE; priv->default_route.v4_has = FALSE; priv->default_route.v6_has = FALSE; @@ -9993,11 +10000,6 @@ _cleanup_generic_post (NMDevice *self, CleanupType cleanup_type) priv->linklocal6_dad_counter = 0; - /* Clean up IP configs; this does not actually deconfigure the - * interface; the caller must flush routes and addresses explicitly. - */ - nm_device_set_ip4_config (self, NULL, 0, TRUE, TRUE, &ignored); - nm_device_set_ip6_config (self, NULL, TRUE, TRUE, &ignored); g_clear_object (&priv->con_ip4_config); g_clear_object (&priv->dev_ip4_config); g_clear_object (&priv->ext_ip4_config); diff --git a/src/nm-default-route-manager.c b/src/nm-default-route-manager.c index 3ee634a7b7..8c466d9822 100644 --- a/src/nm-default-route-manager.c +++ b/src/nm-default-route-manager.c @@ -1175,7 +1175,9 @@ _ipx_get_best_config (const VTableIP *vtable, config_result = nm_device_get_ip4_config (device); else config_result = nm_device_get_ip6_config (device); - g_assert (config_result); + if (!config_result) + continue; + req = nm_device_get_act_request (device); g_assert (req); diff --git a/src/nm-manager.c b/src/nm-manager.c index a509c77a78..ffed8ba637 100644 --- a/src/nm-manager.c +++ b/src/nm-manager.c @@ -872,8 +872,8 @@ remove_device (NMManager *self, if (nm_device_is_real (device)) { g_signal_emit (self, signals[DEVICE_REMOVED], 0, device); _notify (self, PROP_DEVICES); - nm_device_removed (device); } + nm_device_removed (device); g_signal_emit (self, signals[INTERNAL_DEVICE_REMOVED], 0, device); _notify (self, PROP_ALL_DEVICES);