| diff -up dhcp-4.2.4/common/dispatch.c.foo dhcp-4.2.4/common/dispatch.c |
| |
| |
| @@ -324,7 +324,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) { |
| /* |