]>
Commit | Line | Data |
---|---|---|
444c1184 MT |
1 | diff -up dhcp-4.2.4/common/dispatch.c.foo dhcp-4.2.4/common/dispatch.c |
2 | --- dhcp-4.2.4/common/dispatch.c.foo 2012-07-26 21:31:43.875349675 -0500 | |
3 | +++ dhcp-4.2.4/common/dispatch.c 2012-07-26 21:39:14.961710319 -0500 | |
4 | @@ -324,7 +324,20 @@ void add_timeout (when, where, what, ref | |
5 | q->next = timeouts; | |
6 | timeouts = q; | |
7 | ||
8 | - isc_interval_set(&interval, sec & DHCP_SEC_MAX, usec * 1000); | |
9 | + /* isc_time_nowplusinterval() is not safe with 64-bit time_t and will | |
10 | + * return an error for sufficiently large intervals. We have to limit | |
11 | + * the interval to INT_MAX or less to ensure the interval doesn't | |
12 | + * overflow 32 bits, since the returned isc_time_t fields are | |
13 | + * 32-bit unsigned ints. | |
14 | + * | |
15 | + * HACK: The 9 is a magic number of seconds, since some time may have | |
16 | + * gone by since the last call to gettimeofday() and the one in | |
17 | + * isc_time_nowplusinterval(). | |
18 | + */ | |
19 | + if (sec > TIME_MAX) | |
20 | + sec = TIME_MAX - 9; | |
21 | + | |
22 | + isc_interval_set(&interval, sec, usec * 1000); | |
23 | status = isc_time_nowplusinterval(&expires, &interval); | |
24 | if (status != ISC_R_SUCCESS) { | |
25 | /* |