diff options
| author | Paul Eggert | 2006-04-04 04:13:02 +0000 |
|---|---|---|
| committer | Paul Eggert | 2006-04-04 04:13:02 +0000 |
| commit | d65b42351fbebde2539d447ecf5443e1725bdce3 (patch) | |
| tree | deb0a158f63a41290877cd94550db6d95bd4d500 /src | |
| parent | d4d0c924b1b4b6d0a20b21b791b0226ba579f5fb (diff) | |
| download | emacs-d65b42351fbebde2539d447ecf5443e1725bdce3.tar.gz emacs-d65b42351fbebde2539d447ecf5443e1725bdce3.zip | |
* 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.
Diffstat (limited to 'src')
| -rw-r--r-- | src/ChangeLog | 10 | ||||
| -rw-r--r-- | src/editfns.c | 34 |
2 files changed, 27 insertions, 17 deletions
diff --git a/src/ChangeLog b/src/ChangeLog index 88a8b7b4df5..669c5a0c0b9 100644 --- a/src/ChangeLog +++ b/src/ChangeLog | |||
| @@ -1,3 +1,13 @@ | |||
| 1 | 2006-04-03 Paul Eggert <eggert@cs.ucla.edu> | ||
| 2 | |||
| 3 | * editfns.c (TM_YEAR_IN_ASCTIME_RANGE): New macro, identical to | ||
| 4 | ../lib-src/b2m.c and ../lib-src/editfns.c. | ||
| 5 | (Fcurrent_time_string): Use it. | ||
| 6 | Document that the year might not consume 4 columns if it's outside | ||
| 7 | the range 1000-9999. | ||
| 8 | Check for asctime failure. | ||
| 9 | Don't assume that the output string length is always exactly 24. | ||
| 10 | |||
| 1 | 2006-04-03 YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp> | 11 | 2006-04-03 YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp> |
| 2 | 12 | ||
| 3 | * macterm.c (XTread_socket): Initialize variable `f' before its use. | 13 | * macterm.c (XTread_socket): Initialize variable `f' before its use. |
diff --git a/src/editfns.c b/src/editfns.c index 888bbe3062b..450a7684584 100644 --- a/src/editfns.c +++ b/src/editfns.c | |||
| @@ -74,6 +74,13 @@ extern char **environ; | |||
| 74 | 74 | ||
| 75 | #define TM_YEAR_BASE 1900 | 75 | #define TM_YEAR_BASE 1900 |
| 76 | 76 | ||
| 77 | /* Nonzero if TM_YEAR is a struct tm's tm_year value that causes | ||
| 78 | asctime to have well-defined behavior. */ | ||
| 79 | #ifndef TM_YEAR_IN_ASCTIME_RANGE | ||
| 80 | # define TM_YEAR_IN_ASCTIME_RANGE(tm_year) \ | ||
| 81 | (1000 - TM_YEAR_BASE <= (tm_year) && (tm_year) <= 9999 - TM_YEAR_BASE) | ||
| 82 | #endif | ||
| 83 | |||
| 77 | extern size_t emacs_strftimeu P_ ((char *, size_t, const char *, | 84 | extern size_t emacs_strftimeu P_ ((char *, size_t, const char *, |
| 78 | const struct tm *, int)); | 85 | const struct tm *, int)); |
| 79 | static int tm_diff P_ ((struct tm *, struct tm *)); | 86 | static int tm_diff P_ ((struct tm *, struct tm *)); |
| @@ -1833,7 +1840,8 @@ usage: (encode-time SECOND MINUTE HOUR DAY MONTH YEAR &optional ZONE) */) | |||
| 1833 | DEFUN ("current-time-string", Fcurrent_time_string, Scurrent_time_string, 0, 1, 0, | 1840 | DEFUN ("current-time-string", Fcurrent_time_string, Scurrent_time_string, 0, 1, 0, |
| 1834 | doc: /* Return the current time, as a human-readable string. | 1841 | doc: /* Return the current time, as a human-readable string. |
| 1835 | Programs can use this function to decode a time, | 1842 | Programs can use this function to decode a time, |
| 1836 | since the number of columns in each field is fixed. | 1843 | since the number of columns in each field is fixed |
| 1844 | if the year is in the range 1000-9999. | ||
| 1837 | The format is `Sun Sep 16 01:03:52 1973'. | 1845 | The format is `Sun Sep 16 01:03:52 1973'. |
| 1838 | However, see also the functions `decode-time' and `format-time-string' | 1846 | However, see also the functions `decode-time' and `format-time-string' |
| 1839 | which provide a much more powerful and general facility. | 1847 | which provide a much more powerful and general facility. |
| @@ -1847,31 +1855,23 @@ but this is considered obsolete. */) | |||
| 1847 | Lisp_Object specified_time; | 1855 | Lisp_Object specified_time; |
| 1848 | { | 1856 | { |
| 1849 | time_t value; | 1857 | time_t value; |
| 1850 | char buf[30]; | ||
| 1851 | struct tm *tm; | 1858 | struct tm *tm; |
| 1852 | register char *tem; | 1859 | register char *tem; |
| 1853 | 1860 | ||
| 1854 | if (! lisp_time_argument (specified_time, &value, NULL)) | 1861 | if (! lisp_time_argument (specified_time, &value, NULL)) |
| 1855 | error ("Invalid time specification"); | 1862 | error ("Invalid time specification"); |
| 1856 | /* Do not use ctime, since it has undefined behavior with | 1863 | |
| 1857 | out-of-range time stamps. This avoids a core dump triggered by | 1864 | /* Convert to a string, checking for out-of-range time stamps. |
| 1858 | (current-time-string '(2814749767106 0)) on 64-bit Solaris 8. See | 1865 | Don't use 'ctime', as that might dump core if VALUE is out of |
| 1859 | <http://www.opengroup.org/austin/mailarchives/ag/msg09294.html> | 1866 | range. */ |
| 1860 | for more details about this portability problem. */ | ||
| 1861 | tm = localtime (&value); | 1867 | tm = localtime (&value); |
| 1862 | /* Checking for out-of-range time stamps avoids buffer overruns that | 1868 | if (! (tm && TM_YEAR_IN_ASCTIME_RANGE (tm->tm_year) && (tem = asctime (tm)))) |
| 1863 | cause core dump on some systems (e.g., 64-bit Solaris), and also | ||
| 1864 | preserves the historic behavior of always returning a fixed-size | ||
| 1865 | 24-character string. */ | ||
| 1866 | if (! (tm && -999 - TM_YEAR_BASE <= tm->tm_year | ||
| 1867 | && tm->tm_year <= 9999 - TM_YEAR_BASE)) | ||
| 1868 | error ("Specified time is not representable"); | 1869 | error ("Specified time is not representable"); |
| 1869 | tem = asctime (tm); | ||
| 1870 | 1870 | ||
| 1871 | strncpy (buf, tem, 24); | 1871 | /* Remove the trailing newline. */ |
| 1872 | buf[24] = 0; | 1872 | tem[strlen (tem) - 1] = '\0'; |
| 1873 | 1873 | ||
| 1874 | return build_string (buf); | 1874 | return build_string (tem); |
| 1875 | } | 1875 | } |
| 1876 | 1876 | ||
| 1877 | /* Yield A - B, measured in seconds. | 1877 | /* Yield A - B, measured in seconds. |