From 87cd30c7d9a3cd92547cf13f6b05553e2ae39fb0 Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Fri, 6 Jul 2018 17:47:30 +0200 Subject: [PATCH] device: destroy pending acd-managers when the device disconnects We previously kept any acd-manager running if the device was disconnected. It was possible to trigger a crash by setting a long dad-timeout and interrupting the activation request: nmcli con add type ethernet ifname eth0 con-name eth0+ ip4 1.2.3.4/32 nmcli con mod eth0+ ipv4.dad-timeout 10000 nmcli -w 2 con up eth0+ nmcli con down eth0+ After this, the n-acd timer would fire after 10 seconds and try to disconnect an already disconnected device, throwing the assertion: NetworkManager:ERROR:src/devices/nm-device.c:9845: activate_stage5_ip4_config_result: assertion failed: (req) Fixes: 28f6e8b4d2ae554042027cb7af261289eb07e1e4 (cherry picked from commit 260cded3d6a1dc8d8aa02f126908dc1667f163ed) --- src/devices/nm-device.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c index 5a5cb50e9f..19e43762b9 100644 --- a/src/devices/nm-device.c +++ b/src/devices/nm-device.c @@ -10225,6 +10225,8 @@ _cleanup_ip_pre (NMDevice *self, int addr_family, CleanupType cleanup_type) arp_cleanup (self); dnsmasq_cleanup (self); ipv4ll_cleanup (self); + g_slist_free_full (priv->acd.dad_list, (GDestroyNotify) nm_acd_manager_destroy); + priv->acd.dad_list = NULL; } else { g_slist_free_full (priv->dad6_failed_addrs, (GDestroyNotify) nmp_object_unref); priv->dad6_failed_addrs = NULL; @@ -15393,9 +15395,6 @@ dispose (GObject *object) g_signal_handlers_disconnect_by_func (platform, G_CALLBACK (device_ipx_changed), self); g_signal_handlers_disconnect_by_func (platform, G_CALLBACK (link_changed_cb), self); - g_slist_free_full (priv->acd.dad_list, (GDestroyNotify) nm_acd_manager_destroy); - priv->acd.dad_list = NULL; - arp_cleanup (self); nm_clear_g_signal_handler (nm_config_get (), &priv->config_changed_id);