X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/6b61353c0a0320ee15bb6488149735381fed62ec..72d5003de7f3b317ef556d546c25d36b37f33d15:/lib-src/fakemail.c diff --git a/lib-src/fakemail.c b/lib-src/fakemail.c index 944a728a28..993f90f3e8 100644 --- a/lib-src/fakemail.c +++ b/lib-src/fakemail.c @@ -1,11 +1,12 @@ /* sendmail-like interface to /bin/mail for system V, - Copyright (C) 1985, 1994, 1999 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, @@ -15,10 +16,9 @@ GNU General Public License for more details. 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 */ #ifdef HAVE_CONFIG_H @@ -69,6 +69,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 @@ -165,11 +174,11 @@ error (s1, s2) /* Print error message and exit. */ static void -fatal (s1, s2) - char *s1, *s2; +fatal (s1) + char *s1; { - error (s1, s2); - exit (1); + error ("%s", s1); + exit (EXIT_FAILURE); } /* Like malloc but get fatal error if memory is exhausted. */ @@ -180,7 +189,7 @@ xmalloc (size) { long *result = (long *) malloc (((unsigned) size)); if (result == ((long *) NULL)) - fatal ("virtual memory exhausted", 0); + fatal ("virtual memory exhausted"); return result; } @@ -353,6 +362,7 @@ make_file_preface () { char *the_string, *temp; long idiotic_interface; + struct tm *tm; long prefix_length; long user_length; long date_length; @@ -360,7 +370,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"); /* the_date has an unwanted newline at the end */ date_length = strlen (the_date) - 1; the_date[date_length] = '\0'; @@ -410,7 +426,7 @@ close_the_streams () no_problems = (no_problems && ((*rem->action) (rem->handle) == 0)); the_streams = ((stream_list) NULL); - return (no_problems ? 0 : 1); + return (no_problems ? EXIT_SUCCESS : EXIT_FAILURE); } void @@ -667,7 +683,7 @@ read_header () if (next_line == ((line_list *) NULL)) { /* Not a valid header */ - exit (1); + exit (EXIT_FAILURE); } *next_line = new_list (); (*next_line)->string = alloc_string (length); @@ -677,6 +693,8 @@ read_header () } while (true); + if (! the_header) + fatal ("input message has no header"); return the_header->next; } @@ -753,3 +771,5 @@ main (argc, argv) /* arch-tag: acb0afa6-315a-4c5b-b9e3-def5725c8783 (do not change this comment) */ + +/* fakemail.c ends here */