/* sendmail-like interface to /bin/mail for system V,
- Copyright (C) 1985, 1994, 1999 Free Software Foundation, Inc.
+ Copyright (C) 1985, 1994, 1999, 2002, 2003, 2004,
+ 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Emacs.
You should have received a copy of the GNU General Public License
along with GNU Emacs; see the file COPYING. If not, write to
-the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA. */
+the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+Boston, MA 02110-1301, USA. */
#define NO_SHORTNAMES
#define _XOPEN_SOURCE 500 /* for cuserid */
#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
{
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", 0);
/* 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