summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin Berg <bberg@redhat.com>2018-11-15 11:44:56 +0100
committerThomas Haller <thaller@redhat.com>2018-11-15 15:07:36 +0100
commit21a7c4ccea484bbb8249d39f835dcd82ca849502 (patch)
treecb862c00f2f9cbe886ff4cf89922e127c231db74
parentef3152220b834434c557f0343bc38483ebec4aa2 (diff)
downloadNetworkManager-21a7c4ccea484bbb8249d39f835dcd82ca849502.tar.gz
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) (cherry picked from commit bbef6cf44a6e7b19086e5366ce79bb81cd983ec9) (cherry picked from commit d535f95b6b7df69c185b88ab39ee228e99b0c397) (cherry picked from commit fe5949dcff5f992176f6e1d2443eab70b80dd5f4)
-rw-r--r--src/systemd/src/libsystemd-network/sd-dhcp6-client.c2
1 files changed, 2 insertions, 0 deletions
diff --git a/src/systemd/src/libsystemd-network/sd-dhcp6-client.c b/src/systemd/src/libsystemd-network/sd-dhcp6-client.c
index fa508d68d7..c854e14b5f 100644
--- a/src/systemd/src/libsystemd-network/sd-dhcp6-client.c
+++ b/src/systemd/src/libsystemd-network/sd-dhcp6-client.c
@@ -1100,6 +1100,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,
@@ -1122,6 +1123,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,