* m4/mktime.m4 (AC_FUNC_MKTIME): Sync from Autoconf.
authorPaul Eggert <eggert@cs.ucla.edu>
Fri, 22 Dec 2006 08:53:57 +0000 (08:53 +0000)
committerPaul Eggert <eggert@cs.ucla.edu>
Fri, 22 Dec 2006 08:53:57 +0000 (08:53 +0000)
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.

ChangeLog
m4/mktime.m4

index bf28ed1243c1abd50a6db39e82de5a83b2347b81..8ff3b0ded67d6a36f1f31b72491981cfb667c156 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+2006-12-22  Paul Eggert  <eggert@cs.ucla.edu>
+
+       * m4/mktime.m4 (AC_FUNC_MKTIME): Sync from Autoconf.
+       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.
+
 2006-12-21  Paul Eggert  <eggert@cs.ucla.edu>
 
        * MODULES.html.sh: New module wctype.
index ffc05e4417dd02b688ae1f555606d7d8731c62fd..a65a369b196bf62c9a290121dcd7811853a95fcd 100644 (file)
@@ -1,4 +1,4 @@
-#serial 8
+#serial 9
 dnl Copyright (C) 2002, 2003, 2005, 2006 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
@@ -6,10 +6,10 @@ dnl with or without modifications, as long as this notice is preserved.
 
 dnl From Jim Meyering.
 
-# Redefine AC_FUNC_MKTIME, to fix a bug in Autoconf 2.60a and earlier.
+# Redefine AC_FUNC_MKTIME, to fix a bug in Autoconf 2.61a and earlier.
 # This redefinition can be removed once a new version of Autoconf is assumed.
 # The redefinition is taken from
-# <http://cvs.sv.gnu.org/viewcvs/*checkout*/autoconf/lib/autoconf/functions.m4?rev=1.108&root=autoconf>.
+# <http://cvs.sv.gnu.org/viewcvs/*checkout*/autoconf/autoconf/lib/autoconf/functions.m4?rev=1.119>.
 # AC_FUNC_MKTIME
 # --------------
 AC_DEFUN([AC_FUNC_MKTIME],
@@ -30,6 +30,7 @@ AC_CACHE_CHECK([for working mktime], ac_cv_func_working_mktime,
 # endif
 #endif
 
+#include <limits.h>
 #include <stdlib.h>
 
 #ifdef HAVE_UNISTD_H
@@ -178,12 +179,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++)
     {
@@ -198,10 +202,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 ());