--- /dev/null
+diff -up dhcp-4.2.4/common/dispatch.c.foo dhcp-4.2.4/common/dispatch.c
+--- dhcp-4.2.4/common/dispatch.c.foo 2012-07-26 21:31:43.875349675 -0500
++++ dhcp-4.2.4/common/dispatch.c 2012-07-26 21:39:14.961710319 -0500
+@@ -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) {
+ /*