Mercurial > emacs
changeset 69790:1e68e7f3b824
* lib-src/b2m.c (main): Don't include <limits.h>.
(TM_YEAR_BASE): New macro.
(TM_YEAR_IN_ASCTIME_RANGE): Don't define if already defined, so
that s/ files can override this. Use the more-conservative range
1000-9999.
(main): Check for asctime returning NULL.
* lib-src/fakemail.c: Likewise.
* src/editfns.c (TM_YEAR_IN_ASCTIME_RANGE): New macro, identical to
../lib-src/b2m.c and ../lib-src/editfns.c.
(Fcurrent_time_string): Use it.
Document that the year might not consume 4 columns if it's outside
the range 1000-9999.
Check for asctime failure.
Don't assume that the output string length is always exactly 24.
author | Paul Eggert <eggert@twinsun.com> |
---|---|
date | Tue, 04 Apr 2006 04:13:02 +0000 |
parents | f2f387f7dd04 |
children | 4192bb0fddd0 |
files | lib-src/ChangeLog lib-src/b2m.c lib-src/fakemail.c src/ChangeLog src/editfns.c |
diffstat | 5 files changed, 55 insertions(+), 41 deletions(-) [+] |
line wrap: on
line diff
--- a/lib-src/ChangeLog Tue Apr 04 03:39:23 2006 +0000 +++ b/lib-src/ChangeLog Tue Apr 04 04:13:02 2006 +0000 @@ -1,3 +1,13 @@ +2006-04-02 Paul Eggert <eggert@cs.ucla.edu> + + * b2m.c (main): Don't include <limits.h>. + (TM_YEAR_BASE): New macro. + (TM_YEAR_IN_ASCTIME_RANGE): Don't define if already defined, so + that s/ files can override this. Use the more-conservative range + 1000-9999. + (main): Check for asctime returning NULL. + * fakemail.c: Likewise. + 2006-03-27 Paul Eggert <eggert@cs.ucla.edu> * b2m.c: Include <limits.h>.
--- a/lib-src/b2m.c Tue Apr 04 03:39:23 2006 +0000 +++ b/lib-src/b2m.c Tue Apr 04 04:13:02 2006 +0000 @@ -26,7 +26,6 @@ #undef static #endif -#include <limits.h> #include <stdio.h> #include <time.h> #include <sys/types.h> @@ -45,15 +44,13 @@ 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_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) \ - (-999 - 1900 <= (tm_year) && (tm_year) <= 9999 - 1900) + (1000 - TM_YEAR_BASE <= (tm_year) && (tm_year) <= 9999 - TM_YEAR_BASE) #endif /* @@ -148,9 +145,9 @@ 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))) + if (! (tm && TM_YEAR_IN_ASCTIME_RANGE (tm->tm_year) + && (today = asctime (tm)))) fatal ("current time is out of range"); - today = asctime (tm); data.size = 200; data.buffer = xnew (200, char);
--- a/lib-src/fakemail.c Tue Apr 04 03:39:23 2006 +0000 +++ b/lib-src/fakemail.c Tue Apr 04 04:13:02 2006 +0000 @@ -53,7 +53,6 @@ #include "ntlib.h" #endif -#include <limits.h> #include <stdio.h> #include <string.h> #include <ctype.h> @@ -71,15 +70,13 @@ #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_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) \ - (-999 - 1900 <= (tm_year) && (tm_year) <= 9999 - 1900) + (1000 - TM_YEAR_BASE <= (tm_year) && (tm_year) <= 9999 - TM_YEAR_BASE) #endif /* Various lists */ @@ -378,9 +375,9 @@ 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))) + if (! (tm && TM_YEAR_IN_ASCTIME_RANGE (tm->tm_year) + && (the_date = asctime (tm)))) 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';
--- a/src/ChangeLog Tue Apr 04 03:39:23 2006 +0000 +++ b/src/ChangeLog Tue Apr 04 04:13:02 2006 +0000 @@ -1,3 +1,13 @@ +2006-04-03 Paul Eggert <eggert@cs.ucla.edu> + + * editfns.c (TM_YEAR_IN_ASCTIME_RANGE): New macro, identical to + ../lib-src/b2m.c and ../lib-src/editfns.c. + (Fcurrent_time_string): Use it. + Document that the year might not consume 4 columns if it's outside + the range 1000-9999. + Check for asctime failure. + Don't assume that the output string length is always exactly 24. + 2006-04-03 YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp> * macterm.c (XTread_socket): Initialize variable `f' before its use.
--- a/src/editfns.c Tue Apr 04 03:39:23 2006 +0000 +++ b/src/editfns.c Tue Apr 04 04:13:02 2006 +0000 @@ -74,6 +74,13 @@ #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 + extern size_t emacs_strftimeu P_ ((char *, size_t, const char *, const struct tm *, int)); static int tm_diff P_ ((struct tm *, struct tm *)); @@ -1833,7 +1840,8 @@ DEFUN ("current-time-string", Fcurrent_time_string, Scurrent_time_string, 0, 1, 0, doc: /* Return the current time, as a human-readable string. Programs can use this function to decode a time, -since the number of columns in each field is fixed. +since the number of columns in each field is fixed +if the year is in the range 1000-9999. The format is `Sun Sep 16 01:03:52 1973'. However, see also the functions `decode-time' and `format-time-string' which provide a much more powerful and general facility. @@ -1847,31 +1855,23 @@ Lisp_Object specified_time; { time_t value; - char buf[30]; struct tm *tm; register char *tem; if (! lisp_time_argument (specified_time, &value, NULL)) error ("Invalid time specification"); - /* Do not use ctime, since it has undefined behavior with - out-of-range time stamps. This avoids a core dump triggered by - (current-time-string '(2814749767106 0)) on 64-bit Solaris 8. See - <http://www.opengroup.org/austin/mailarchives/ag/msg09294.html> - for more details about this portability problem. */ + + /* Convert to a string, checking for out-of-range time stamps. + Don't use 'ctime', as that might dump core if VALUE is out of + range. */ tm = localtime (&value); - /* Checking for out-of-range time stamps avoids buffer overruns that - cause core dump on some systems (e.g., 64-bit Solaris), and also - preserves the historic behavior of always returning a fixed-size - 24-character string. */ - if (! (tm && -999 - TM_YEAR_BASE <= tm->tm_year - && tm->tm_year <= 9999 - TM_YEAR_BASE)) + if (! (tm && TM_YEAR_IN_ASCTIME_RANGE (tm->tm_year) && (tem = asctime (tm)))) error ("Specified time is not representable"); - tem = asctime (tm); - - strncpy (buf, tem, 24); - buf[24] = 0; - - return build_string (buf); + + /* Remove the trailing newline. */ + tem[strlen (tem) - 1] = '\0'; + + return build_string (tem); } /* Yield A - B, measured in seconds.