[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Emacs current-time-string core dump on 64-bit hosts
From: |
Paul Eggert |
Subject: |
Re: Emacs current-time-string core dump on 64-bit hosts |
Date: |
Mon, 27 Mar 2006 12:49:36 -0800 |
User-agent: |
Gnus/5.1007 (Gnus v5.10.7) Emacs/21.4 (gnu/linux) |
Richard Stallman <rms@gnu.org> writes:
> Ok, you can install this change.
>
> However, we don't want any of these changes to be operative on the GNU
> system because all they do is cause trouble. On the GNU system, large
> year numbers work. Why interfere with their use?
>
> So I think you should conditionalize them.
OK, I conditionalized them, and installed the following revised change.
2006-03-27 Paul Eggert <eggert@cs.ucla.edu>
* lib-src/b2m.c: Include <limits.h>.
(TM_YEAR_IN_ASCTIME_RANGE): New macro.
(main): Check for out-of-range time stamps.
* lib-src/fakemail.c: Likewise.
--- b2m.c 7 May 2004 15:26:21 -0000 1.30
+++ b2m.c 27 Mar 2006 20:34:18 -0000
@@ -26,6 +26,7 @@
#undef static
#endif
+#include <limits.h>
#include <stdio.h>
#include <time.h>
#include <sys/types.h>
@@ -44,6 +45,17 @@
typedef int logical;
+/* 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
+
/*
* A `struct linebuffer' is a structure which holds a line of text.
* `readline' reads a line from a stream into a linebuffer and works
@@ -87,6 +99,7 @@ main (argc, argv)
{
logical labels_saved, printing, header;
time_t ltoday;
+ struct tm *tm;
char *labels, *p, *today;
struct linebuffer data;
@@ -131,7 +144,13 @@ main (argc, argv)
labels_saved = printing = header = FALSE;
ltoday = time (0);
- today = ctime (<oday);
+ /* 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 (<oday);
+ if (! (tm && TM_YEAR_IN_ASCTIME_RANGE (tm->tm_year)))
+ fatal ("current time is out of range");
+ today = asctime (tm);
data.size = 200;
data.buffer = xnew (200, char);
--- fakemail.c 6 Feb 2006 11:28:28 -0000 1.35
+++ fakemail.c 27 Mar 2006 20:34:18 -0000
@@ -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';
- Re: Emacs current-time-string core dump on 64-bit hosts, (continued)
- Re: Emacs current-time-string core dump on 64-bit hosts, Paul Eggert, 2006/03/26
- Re: Emacs current-time-string core dump on 64-bit hosts, Eli Zaretskii, 2006/03/26
- Re: Emacs current-time-string core dump on 64-bit hosts, Richard Stallman, 2006/03/27
- Re: Emacs current-time-string core dump on 64-bit hosts, Eli Zaretskii, 2006/03/28
- Re: Emacs current-time-string core dump on 64-bit hosts, Richard Stallman, 2006/03/29
- Re: Emacs current-time-string core dump on 64-bit hosts, Richard Stallman, 2006/03/27
- Re: Emacs current-time-string core dump on 64-bit hosts, Paul Eggert, 2006/03/25
- Re: Emacs current-time-string core dump on 64-bit hosts, Paul Eggert, 2006/03/25
- Re: Emacs current-time-string core dump on 64-bit hosts, Richard Stallman, 2006/03/27
- Re: Emacs current-time-string core dump on 64-bit hosts, Paul Eggert, 2006/03/26
- Message not available
- Re: Emacs current-time-string core dump on 64-bit hosts,
Paul Eggert <=
- Re: Emacs current-time-string core dump on 64-bit hosts, Richard Stallman, 2006/03/28
- Re: Emacs current-time-string core dump on 64-bit hosts, Paul Eggert, 2006/03/30
- Re: Emacs current-time-string core dump on 64-bit hosts, Richard Stallman, 2006/03/31
Re: Emacs current-time-string core dump on 64-bit hosts, Andreas Schwab, 2006/03/17
Emacs current-time-string core dump on 64-bit hosts, Paul Eggert, 2006/03/17