]> code.delx.au - gnu-emacs/blobdiff - lib-src/fakemail.c
(mac_update_title_bar): Minor format change.
[gnu-emacs] / lib-src / fakemail.c
index c8bfcfc0931041eb9c3cef501485258bfc1f2a05..30d39db533ee68da589a2442dc6bb23ec2e0f9ff 100644 (file)
@@ -70,6 +70,15 @@ main ()
 #define true 1
 #define false 0
 
+#define TM_YEAR_BASE 1900
+
+/* Nonzero if TM_YEAR is a struct tm's tm_year value that causes
+   asctime to have well-defined behavior.  */
+#ifndef TM_YEAR_IN_ASCTIME_RANGE
+# define TM_YEAR_IN_ASCTIME_RANGE(tm_year) \
+    (1000 - TM_YEAR_BASE <= (tm_year) && (tm_year) <= 9999 - TM_YEAR_BASE)
+#endif
+
 /* Various lists */
 
 struct line_record
@@ -354,6 +363,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 +371,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)
+        && (the_date = asctime (tm))))
+    fatal ("current time is out of range", 0);
   /* the_date has an unwanted newline at the end */
   date_length = strlen (the_date) - 1;
   the_date[date_length] = '\0';
@@ -678,6 +694,8 @@ read_header ()
 
     } while (true);
 
+  if (! the_header)
+    fatal ("input message has no header");
   return the_header->next;
 }
 \f