diff -up dhcp-4.3.0a1/common/dispatch.c.interval dhcp-4.3.0a1/common/dispatch.c --- dhcp-4.3.0a1/common/dispatch.c.interval 2013-12-20 13:51:14.385260622 +0100 +++ dhcp-4.3.0a1/common/dispatch.c 2013-12-20 13:51:14.493259116 +0100 @@ -343,7 +343,20 @@ void add_timeout (when, where, what, ref q->next = timeouts; timeouts = q; - isc_interval_set(&interval, sec & DHCP_SEC_MAX, usec * 1000); + /* isc_time_nowplusinterval() is not safe with 64-bit time_t and will + * return an error for sufficiently large intervals. We have to limit + * the interval to INT_MAX or less to ensure the interval doesn't + * overflow 32 bits, since the returned isc_time_t fields are + * 32-bit unsigned ints. + * + * HACK: The 9 is a magic number of seconds, since some time may have + * gone by since the last call to gettimeofday() and the one in + * isc_time_nowplusinterval(). + */ + if (sec > TIME_MAX) + sec = TIME_MAX - 9; + + isc_interval_set(&interval, sec, usec * 1000); status = isc_time_nowplusinterval(&expires, &interval); if (status != ISC_R_SUCCESS) { /*