]> code.delx.au - gnu-emacs/commitdiff
* b2m.c: Include <limits.h>.
authorPaul Eggert <eggert@twinsun.com>
Mon, 27 Mar 2006 20:40:05 +0000 (20:40 +0000)
committerPaul Eggert <eggert@twinsun.com>
Mon, 27 Mar 2006 20:40:05 +0000 (20:40 +0000)
(TM_YEAR_IN_ASCTIME_RANGE): New macro.
(main): Check for out-of-range time stamps.
* fakemail.c: Likewise.

lib-src/ChangeLog
lib-src/b2m.c
lib-src/fakemail.c

index f59f72963596516d5b917ff4c87a117accef7b71..72ff56c2dfd17df311c7013914c91eb6cbbd8a58 100644 (file)
@@ -1,3 +1,10 @@
+2006-03-27  Paul Eggert  <eggert@cs.ucla.edu>
+
+       * b2m.c: Include <limits.h>.
+       (TM_YEAR_IN_ASCTIME_RANGE): New macro.
+       (main): Check for out-of-range time stamps.
+       * fakemail.c: Likewise.
+
 2006-03-18  Andre Spiegel  <spiegel@gnu.org>
 
        * vcdiff: Use "echo" as a default for $echo, otherwise we'll
index 5bebe560e2a6d187512b2d4904758f87b08e823f..adaa736bcd9388c441b56e676ac22cb06d9cf005 100644 (file)
@@ -26,6 +26,7 @@
 #undef static
 #endif
 
+#include <limits.h>
 #include <stdio.h>
 #include <time.h>
 #include <sys/types.h>
 
 typedef int logical;
 
+/* True if TM_YEAR is a struct tm's tm_year value that is acceptable
+   to asctime.  Glibc asctime returns a useful string unless TM_YEAR
+   is nearly INT_MAX, but the C Standard lets C libraries overrun a
+   buffer if TM_YEAR needs more than 4 bytes.  */
+#ifdef __GLIBC__
+# define TM_YEAR_IN_ASCTIME_RANGE(tm_year) ((tm_year) <= INT_MAX - 1900)
+#else
+# define TM_YEAR_IN_ASCTIME_RANGE(tm_year) \
+    (-999 - 1900 <= (tm_year) && (tm_year) <= 9999 - 1900)
+#endif
+
 /*
  * A `struct linebuffer' is a structure which holds a line of text.
  * `readline' reads a line from a stream into a linebuffer and works
@@ -87,6 +99,7 @@ main (argc, argv)
 {
   logical labels_saved, printing, header;
   time_t ltoday;
+  struct tm *tm;
   char *labels, *p, *today;
   struct linebuffer data;
 
@@ -131,7 +144,13 @@ main (argc, argv)
 
   labels_saved = printing = header = FALSE;
   ltoday = time (0);
-  today = ctime (&ltoday);
+  /* Convert to a string, checking for out-of-range time stamps.
+     Don't use 'ctime', as that might dump core if the hardware clock
+     is set to a bizarre value.  */
+  tm = localtime (&ltoday);
+  if (! (tm && TM_YEAR_IN_ASCTIME_RANGE (tm->tm_year)))
+    fatal ("current time is out of range");
+  today = asctime (tm);
   data.size = 200;
   data.buffer = xnew (200, char);
 
index c8bfcfc0931041eb9c3cef501485258bfc1f2a05..2c2b462e3664a30157a6b922a93e10e93a1e5eb4 100644 (file)
@@ -53,6 +53,7 @@ main ()
 #include "ntlib.h"
 #endif
 
+#include <limits.h>
 #include <stdio.h>
 #include <string.h>
 #include <ctype.h>
@@ -70,6 +71,17 @@ main ()
 #define true 1
 #define false 0
 
+/* True if TM_YEAR is a struct tm's tm_year value that is acceptable
+   to asctime.  Glibc asctime returns a useful string unless TM_YEAR
+   is nearly INT_MAX, but the C Standard lets C libraries overrun a
+   buffer if TM_YEAR needs more than 4 bytes.  */
+#ifdef __GLIBC__
+# define TM_YEAR_IN_ASCTIME_RANGE(tm_year) ((tm_year) <= INT_MAX - 1900)
+#else
+# define TM_YEAR_IN_ASCTIME_RANGE(tm_year) \
+    (-999 - 1900 <= (tm_year) && (tm_year) <= 9999 - 1900)
+#endif
+
 /* Various lists */
 
 struct line_record
@@ -354,6 +366,7 @@ make_file_preface ()
 {
   char *the_string, *temp;
   long idiotic_interface;
+  struct tm *tm;
   long prefix_length;
   long user_length;
   long date_length;
@@ -361,7 +374,13 @@ make_file_preface ()
 
   prefix_length = strlen (FROM_PREFIX);
   time (&idiotic_interface);
-  the_date = ctime (&idiotic_interface);
+  /* Convert to a string, checking for out-of-range time stamps.
+     Don't use 'ctime', as that might dump core if the hardware clock
+     is set to a bizarre value.  */
+  tm = localtime (&idiotic_interface);
+  if (! (tm && TM_YEAR_IN_ASCTIME_RANGE (tm->tm_year)))
+    fatal ("current time is out of range", 0);
+  the_date = asctime (tm);
   /* the_date has an unwanted newline at the end */
   date_length = strlen (the_date) - 1;
   the_date[date_length] = '\0';