summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorPaul Eggert <eggert@cs.ucla.edu>2006-12-22 08:42:17 +0000
committerPaul Eggert <eggert@cs.ucla.edu>2006-12-22 08:42:17 +0000
commit7bd79987b05c64647c168df92c6151adbfb1b283 (patch)
tree35aba891f8a7a0112648b1ffdc6c8f041600f21b /lib
parent3853f83efbbca82722c41de1c7720af33810dce3 (diff)
downloadautoconf-7bd79987b05c64647c168df92c6151adbfb1b283.tar.gz
* lib/autoconf/functions.m4 (AC_FUNC_MKTIME):
Include <limits.h>, and use its INT_MAX to rewrite the j loop so that it does not overflow 'int'. Problem reported by Ralf Wildenhues in <http://lists.gnu.org/archive/html/bug-gnulib/2006-12/msg00084.html>. Play it safe by shifting left by 1 rather than multiplying by 2, as GCC is less likely to optimize this away when the value is signed (when it assumes overflow leads to undefined behavior). Also, don't assume time_t uses two's complement.
Diffstat (limited to 'lib')
-rw-r--r--lib/autoconf/functions.m422
1 files changed, 14 insertions, 8 deletions
diff --git a/lib/autoconf/functions.m4 b/lib/autoconf/functions.m4
index 185376e9..a34c9f0e 100644
--- a/lib/autoconf/functions.m4
+++ b/lib/autoconf/functions.m4
@@ -984,6 +984,7 @@ AC_CACHE_CHECK([for working mktime], ac_cv_func_working_mktime,
# endif
#endif
+#include <limits.h>
#include <stdlib.h>
#ifdef HAVE_UNISTD_H
@@ -1132,12 +1133,15 @@ main ()
isn't worth using anyway. */
alarm (60);
- for (time_t_max = 1; 0 < time_t_max; time_t_max *= 2)
- continue;
- time_t_max--;
- if ((time_t) -1 < 0)
- for (time_t_min = -1; (time_t) (time_t_min * 2) < 0; time_t_min *= 2)
- continue;
+ for (;;)
+ {
+ t = (time_t_max << 1) + 1;
+ if (t <= time_t_max)
+ break;
+ time_t_max = t;
+ }
+ time_t_min = - ((time_t) ~ (time_t) 0 == (time_t) -1) - time_t_max;
+
delta = time_t_max / 997; /* a suitable prime number */
for (i = 0; i < N_STRINGS; i++)
{
@@ -1152,10 +1156,12 @@ main ()
&& mktime_test ((time_t) (60 * 60 * 24))))
return 1;
- for (j = 1; 0 < j; j *= 2)
+ for (j = 1; ; j <<= 1)
if (! bigtime_test (j))
return 1;
- if (! bigtime_test (j - 1))
+ else if (INT_MAX / 2 < j)
+ break;
+ if (! bigtime_test (INT_MAX))
return 1;
}
return ! (irix_6_4_bug () && spring_forward_gap () && year_2050_test ());