From f32a59793a33ceca2754187ee06439d4abc63280 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Fri, 24 Sep 2021 17:26:35 +0900 Subject: [PATCH] libsystemd-network: disable event sources before unref them This also (is supposed to) fix a assertion failure when in ipv4acd when receiving an ARP packet in an unexpected state. See-also: https://github.com/systemd/systemd/issues/20825 See-also: https://github.com/systemd/systemd/pull/20826 https://github.com/systemd/systemd/pull/20826/commits/eb2f750242d6c4c0963887dbd561d8bafa318685 https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/issues/807 (cherry picked from commit 7fba0f7cb2764a6c5f81c1993dbc580b25ae9b0f) --- .../src/libsystemd-network/sd-dhcp-client.c | 12 +++++------- .../src/libsystemd-network/sd-ipv4acd.c | 5 ++--- .../src/libsystemd-network/sd-lldp.c | 7 ++++--- 3 files changed, 11 insertions(+), 13 deletions(-) diff --git a/src/libnm-systemd-core/src/libsystemd-network/sd-dhcp-client.c b/src/libnm-systemd-core/src/libsystemd-network/sd-dhcp-client.c index 94e43da395..91bbcb3da0 100644 --- a/src/libnm-systemd-core/src/libsystemd-network/sd-dhcp-client.c +++ b/src/libnm-systemd-core/src/libsystemd-network/sd-dhcp-client.c @@ -721,7 +721,7 @@ static int client_notify(sd_dhcp_client *client, int event) { static int client_initialize(sd_dhcp_client *client) { assert_return(client, -EINVAL); - client->receive_message = sd_event_source_unref(client->receive_message); + client->receive_message = sd_event_source_disable_unref(client->receive_message); client->fd = safe_close(client->fd); @@ -1485,7 +1485,7 @@ static int client_timeout_t2(sd_event_source *s, uint64_t usec, void *userdata) assert(client); - client->receive_message = sd_event_source_unref(client->receive_message); + client->receive_message = sd_event_source_disable_unref(client->receive_message); client->fd = safe_close(client->fd); client->state = DHCP_STATE_REBINDING; @@ -1817,7 +1817,7 @@ static int client_handle_message(sd_dhcp_client *client, DHCPMessage *message, i client->start_delay = 0; (void) event_source_disable(client->timeout_resend); client->receive_message = - sd_event_source_unref(client->receive_message); + sd_event_source_disable_unref(client->receive_message); client->fd = safe_close(client->fd); if (IN_SET(client->state, DHCP_STATE_REQUESTING, @@ -2227,17 +2227,15 @@ static sd_dhcp_client *dhcp_client_free(sd_dhcp_client *client) { log_dhcp_client(client, "FREE"); + client_initialize(client); + client->timeout_resend = sd_event_source_unref(client->timeout_resend); client->timeout_t1 = sd_event_source_unref(client->timeout_t1); client->timeout_t2 = sd_event_source_unref(client->timeout_t2); client->timeout_expire = sd_event_source_unref(client->timeout_expire); - client_initialize(client); - sd_dhcp_client_detach_event(client); - sd_dhcp_lease_unref(client->lease); - set_free(client->req_opts); free(client->hostname); free(client->vendor_class_identifier); diff --git a/src/libnm-systemd-core/src/libsystemd-network/sd-ipv4acd.c b/src/libnm-systemd-core/src/libsystemd-network/sd-ipv4acd.c index 031804caf2..ab05a56fe1 100644 --- a/src/libnm-systemd-core/src/libsystemd-network/sd-ipv4acd.c +++ b/src/libnm-systemd-core/src/libsystemd-network/sd-ipv4acd.c @@ -119,7 +119,7 @@ static void ipv4acd_reset(sd_ipv4acd *acd) { assert(acd); (void) event_source_disable(acd->timer_event_source); - acd->receive_message_event_source = sd_event_source_unref(acd->receive_message_event_source); + acd->receive_message_event_source = sd_event_source_disable_unref(acd->receive_message_event_source); acd->fd = safe_close(acd->fd); @@ -129,9 +129,8 @@ static void ipv4acd_reset(sd_ipv4acd *acd) { static sd_ipv4acd *ipv4acd_free(sd_ipv4acd *acd) { assert(acd); - acd->timer_event_source = sd_event_source_unref(acd->timer_event_source); - ipv4acd_reset(acd); + sd_event_source_unref(acd->timer_event_source); sd_ipv4acd_detach_event(acd); free(acd->ifname); return mfree(acd); diff --git a/src/libnm-systemd-core/src/libsystemd-network/sd-lldp.c b/src/libnm-systemd-core/src/libsystemd-network/sd-lldp.c index 09c2052f91..59df083179 100644 --- a/src/libnm-systemd-core/src/libsystemd-network/sd-lldp.c +++ b/src/libnm-systemd-core/src/libsystemd-network/sd-lldp.c @@ -241,7 +241,7 @@ static void lldp_reset(sd_lldp *lldp) { assert(lldp); (void) event_source_disable(lldp->timer_event_source); - lldp->io_event_source = sd_event_source_unref(lldp->io_event_source); + lldp->io_event_source = sd_event_source_disable_unref(lldp->io_event_source); lldp->fd = safe_close(lldp->fd); } @@ -367,10 +367,11 @@ const char *sd_lldp_get_ifname(sd_lldp *lldp) { static sd_lldp* lldp_free(sd_lldp *lldp) { assert(lldp); - lldp->timer_event_source = sd_event_source_unref(lldp->timer_event_source); - lldp_reset(lldp); + + sd_event_source_unref(lldp->timer_event_source); sd_lldp_detach_event(lldp); + lldp_flush_neighbors(lldp); hashmap_free(lldp->neighbor_by_id);