You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
25 lines
1.0 KiB
25 lines
1.0 KiB
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) { |
|
/*
|
|
|