summaryrefslogtreecommitdiff
path: root/lib-src/fakemail.c
diff options
context:
space:
mode:
authorPaul Eggert <eggert@twinsun.com>2006-03-27 20:40:05 +0000
committerPaul Eggert <eggert@twinsun.com>2006-03-27 20:40:05 +0000
commitf55658040dbc67b3acf345d82d017e47389b0727 (patch)
tree0add62d9c9ae6aa128f300e2ccb548d0869f36a8 /lib-src/fakemail.c
parentab5523ffae1f91e6edcb3bf57e1628bda098b655 (diff)
downloademacs-f55658040dbc67b3acf345d82d017e47389b0727.tar.gz
* b2m.c: Include <limits.h>.
(TM_YEAR_IN_ASCTIME_RANGE): New macro. (main): Check for out-of-range time stamps. * fakemail.c: Likewise.
Diffstat (limited to 'lib-src/fakemail.c')
-rw-r--r--lib-src/fakemail.c21
1 files changed, 20 insertions, 1 deletions
diff --git a/lib-src/fakemail.c b/lib-src/fakemail.c
index c8bfcfc0931..2c2b462e366 100644
--- a/lib-src/fakemail.c
+++ b/lib-src/fakemail.c
@@ -53,6 +53,7 @@ main ()
#include "ntlib.h"
#endif
+#include <limits.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
@@ -70,6 +71,17 @@ main ()
#define true 1
#define false 0
+/* True if TM_YEAR is a struct tm's tm_year value that is acceptable
+ to asctime. Glibc asctime returns a useful string unless TM_YEAR
+ is nearly INT_MAX, but the C Standard lets C libraries overrun a
+ buffer if TM_YEAR needs more than 4 bytes. */
+#ifdef __GLIBC__
+# define TM_YEAR_IN_ASCTIME_RANGE(tm_year) ((tm_year) <= INT_MAX - 1900)
+#else
+# define TM_YEAR_IN_ASCTIME_RANGE(tm_year) \
+ (-999 - 1900 <= (tm_year) && (tm_year) <= 9999 - 1900)
+#endif
+
/* Various lists */
struct line_record
@@ -354,6 +366,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 +374,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)))
+ fatal ("current time is out of range", 0);
+ the_date = asctime (tm);
/* the_date has an unwanted newline at the end */
date_length = strlen (the_date) - 1;
the_date[date_length] = '\0';