/* sendmail-like interface to /bin/mail for system V,
- Copyright (C) 1985, 1994, 1999, 2002, 2003, 2004,
- 2005 Free Software Foundation, Inc.
+ Copyright (C) 1985, 1994, 1999, 2001, 2002, 2003, 2004,
+ 2005, 2006, 2007, 2008 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
-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,
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, USA. */
-#define NO_SHORTNAMES
#define _XOPEN_SOURCE 500 /* for cuserid */
#ifdef HAVE_CONFIG_H
#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
/* 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);
}
{
long *result = (long *) malloc (((unsigned) size));
if (result == ((long *) NULL))
- fatal ("virtual memory exhausted", 0);
+ fatal ("virtual memory exhausted");
return result;
}
{
char *the_string, *temp;
long idiotic_interface;
+ struct tm *tm;
long prefix_length;
long user_length;
long date_length;
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';
} while (true);
+ if (! the_header)
+ fatal ("input message has no header");
return the_header->next;
}
\f