Commit dd0e0a39 authored by Simon Kelley's avatar Simon Kelley

Handle time_t wraparound more sanely.

parent 6fd6dacb
...@@ -306,7 +306,7 @@ void lease_update_file(time_t now) ...@@ -306,7 +306,7 @@ void lease_update_file(time_t now)
file_dirty = 0; file_dirty = 0;
} }
/* Set alarm for when the first lease expires + slop. */ /* Set alarm for when the first lease expires. */
next_event = 0; next_event = 0;
#ifdef HAVE_DHCP6 #ifdef HAVE_DHCP6
...@@ -331,8 +331,8 @@ void lease_update_file(time_t now) ...@@ -331,8 +331,8 @@ void lease_update_file(time_t now)
for (lease = leases; lease; lease = lease->next) for (lease = leases; lease; lease = lease->next)
if (lease->expires != 0 && if (lease->expires != 0 &&
(next_event == 0 || difftime(next_event, lease->expires + 10) > 0.0)) (next_event == 0 || difftime(next_event, lease->expires) > 0.0))
next_event = lease->expires + 10; next_event = lease->expires;
if (err) if (err)
{ {
...@@ -745,14 +745,23 @@ struct dhcp_lease *lease6_allocate(struct in6_addr *addrp, int lease_type) ...@@ -745,14 +745,23 @@ struct dhcp_lease *lease6_allocate(struct in6_addr *addrp, int lease_type)
void lease_set_expires(struct dhcp_lease *lease, unsigned int len, time_t now) void lease_set_expires(struct dhcp_lease *lease, unsigned int len, time_t now)
{ {
time_t exp = now + (time_t)len; time_t exp;
if (len == 0xffffffff) if (len == 0xffffffff)
{ {
exp = 0; exp = 0;
len = 0; len = 0;
} }
else
{
exp = now + (time_t)len;
/* Check for 2038 overflow. Make the lease
inifinite in that case, as the least disruptive
thing we can do. */
if (difftime(exp, now) <= 0.0)
exp = 0;
}
if (exp != lease->expires) if (exp != lease->expires)
{ {
dns_dirty = 1; dns_dirty = 1;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment