]> git.ipfire.org Git - people/ms/ipfire-3.x.git/blobdiff - dhcp/patches/dhcp-4.2.4-P1-interval.patch
dhcp: Update to 4.2.4.
[people/ms/ipfire-3.x.git] / dhcp / patches / dhcp-4.2.4-P1-interval.patch
diff --git a/dhcp/patches/dhcp-4.2.4-P1-interval.patch b/dhcp/patches/dhcp-4.2.4-P1-interval.patch
new file mode 100644 (file)
index 0000000..e8e89c1
--- /dev/null
@@ -0,0 +1,25 @@
+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) {
+               /*