From bbef6cf44a6e7b19086e5366ce79bb81cd983ec9 Mon Sep 17 00:00:00 2001 From: Benjamin Berg Date: Thu, 15 Nov 2018 11:44:56 +0100 Subject: [PATCH] systemd: fix crash by unrefing event sources before re-adding them In certain cases the timeouts may not have been unref'ed before they need to be re-added. Add the appropriate unref calls to ensure we don't register the timeout multiple times. This fixes possible cases where timeouts are triggered multiple times and even on destroyed DHCPv6 clients. https://gitlab.freedesktop.org/NetworkManager/NetworkManager/issues/73 (cherry picked from commit e179202e47b78cf04dd84536581f29162b7e740b) --- src/systemd/src/libsystemd-network/sd-dhcp6-client.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/systemd/src/libsystemd-network/sd-dhcp6-client.c b/src/systemd/src/libsystemd-network/sd-dhcp6-client.c index b694786a77..7dfb2aceed 100644 --- a/src/systemd/src/libsystemd-network/sd-dhcp6-client.c +++ b/src/systemd/src/libsystemd-network/sd-dhcp6-client.c @@ -1275,6 +1275,7 @@ static int client_start(sd_dhcp6_client *client, enum DHCP6State state) { log_dhcp6_client(client, "T1 expires in %s", format_timespan(time_string, FORMAT_TIMESPAN_MAX, timeout, USEC_PER_SEC)); + client->lease->ia.timeout_t1 = sd_event_source_unref(client->lease->ia.timeout_t1); r = sd_event_add_time(client->event, &client->lease->ia.timeout_t1, clock_boottime_or_monotonic(), time_now + timeout, @@ -1297,6 +1298,7 @@ static int client_start(sd_dhcp6_client *client, enum DHCP6State state) { log_dhcp6_client(client, "T2 expires in %s", format_timespan(time_string, FORMAT_TIMESPAN_MAX, timeout, USEC_PER_SEC)); + client->lease->ia.timeout_t2 = sd_event_source_unref(client->lease->ia.timeout_t2); r = sd_event_add_time(client->event, &client->lease->ia.timeout_t2, clock_boottime_or_monotonic(), time_now + timeout,