diff options
author | Beniamino Galvani <bgalvani@redhat.com> | 2018-07-06 17:47:30 +0200 |
---|---|---|
committer | Beniamino Galvani <bgalvani@redhat.com> | 2018-07-11 17:27:11 +0200 |
commit | 260cded3d6a1dc8d8aa02f126908dc1667f163ed (patch) | |
tree | d41f8303b22e941afef917feb2e72b1880cd8d33 | |
parent | ca9981eb5d0030a3356db67a8f161b5660869f39 (diff) | |
download | NetworkManager-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.c | 5 |
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); |