]> code.delx.au - gnu-emacs/blobdiff - lib-src/fakemail.c
Johannes Weiner <hannes at saeurebad.de>
[gnu-emacs] / lib-src / fakemail.c
index c8bfcfc0931041eb9c3cef501485258bfc1f2a05..003f2da886c055ce92007b0037bf14c696d15917 100644 (file)
@@ -1,12 +1,12 @@
 /* sendmail-like interface to /bin/mail for system V,
 /* sendmail-like interface to /bin/mail for system V,
-   Copyright (C) 1985, 1994, 1999, 2002, 2003, 2004,
-                 2005, 2006 Free Software Foundation, Inc.
+   Copyright (C) 1985, 1994, 1999, 2001, 2002, 2003, 2004,
+                 2005, 2006, 2007  Free Software Foundation, Inc.
 
 This file is part of GNU Emacs.
 
 GNU Emacs is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
 
 This file is part of GNU Emacs.
 
 GNU Emacs is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2, or (at your option)
+the Free Software Foundation; either version 3, or (at your option)
 any later version.
 
 GNU Emacs is distributed in the hope that it will be useful,
 any later version.
 
 GNU Emacs is distributed in the hope that it will be useful,
@@ -70,6 +70,15 @@ main ()
 #define true 1
 #define false 0
 
 #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
 /* Various lists */
 
 struct line_record
@@ -166,10 +175,10 @@ error (s1, s2)
 /* Print error message and exit.  */
 
 static void
 /* Print error message and exit.  */
 
 static void
-fatal (s1, s2)
-     char *s1, *s2;
+fatal (s1)
+     char *s1;
 {
 {
-  error (s1, s2);
+  error ("%s", s1);
   exit (EXIT_FAILURE);
 }
 
   exit (EXIT_FAILURE);
 }
 
@@ -181,7 +190,7 @@ xmalloc (size)
 {
   long *result = (long *) malloc (((unsigned) size));
   if (result == ((long *) NULL))
 {
   long *result = (long *) malloc (((unsigned) size));
   if (result == ((long *) NULL))
-    fatal ("virtual memory exhausted", 0);
+    fatal ("virtual memory exhausted");
   return result;
 }
 
   return result;
 }
 
@@ -354,6 +363,7 @@ make_file_preface ()
 {
   char *the_string, *temp;
   long idiotic_interface;
 {
   char *the_string, *temp;
   long idiotic_interface;
+  struct tm *tm;
   long prefix_length;
   long user_length;
   long date_length;
   long prefix_length;
   long user_length;
   long date_length;
@@ -361,7 +371,13 @@ make_file_preface ()
 
   prefix_length = strlen (FROM_PREFIX);
   time (&idiotic_interface);
 
   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");
   /* the_date has an unwanted newline at the end */
   date_length = strlen (the_date) - 1;
   the_date[date_length] = '\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);
 
 
     } while (true);
 
+  if (! the_header)
+    fatal ("input message has no header");
   return the_header->next;
 }
 \f
   return the_header->next;
 }
 \f