summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBeniamino Galvani <bgalvani@redhat.com>2018-07-06 17:47:30 +0200
committerBeniamino Galvani <bgalvani@redhat.com>2018-07-11 17:27:11 +0200
commit260cded3d6a1dc8d8aa02f126908dc1667f163ed (patch)
treed41f8303b22e941afef917feb2e72b1880cd8d33
parentca9981eb5d0030a3356db67a8f161b5660869f39 (diff)
downloadNetworkManager-260cded3d6a1dc8d8aa02f126908dc1667f163ed.tar.gz
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
-rw-r--r--src/devices/nm-device.c5
1 files changed, 2 insertions, 3 deletions
diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c
index 2117985e1b..7ca2360b27 100644
--- a/src/devices/nm-device.c
+++ b/src/devices/nm-device.c
@@ -10391,6 +10391,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;
@@ -15559,9 +15561,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);