aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPaul Eggert2006-04-04 04:13:02 +0000
committerPaul Eggert2006-04-04 04:13:02 +0000
commitd65b42351fbebde2539d447ecf5443e1725bdce3 (patch)
treedeb0a158f63a41290877cd94550db6d95bd4d500 /src
parentd4d0c924b1b4b6d0a20b21b791b0226ba579f5fb (diff)
downloademacs-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/ChangeLog10
-rw-r--r--src/editfns.c34
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 @@
12006-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
12006-04-03 YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp> 112006-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
77extern size_t emacs_strftimeu P_ ((char *, size_t, const char *, 84extern size_t emacs_strftimeu P_ ((char *, size_t, const char *,
78 const struct tm *, int)); 85 const struct tm *, int));
79static int tm_diff P_ ((struct tm *, struct tm *)); 86static int tm_diff P_ ((struct tm *, struct tm *));
@@ -1833,7 +1840,8 @@ usage: (encode-time SECOND MINUTE HOUR DAY MONTH YEAR &optional ZONE) */)
1833DEFUN ("current-time-string", Fcurrent_time_string, Scurrent_time_string, 0, 1, 0, 1840DEFUN ("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.
1835Programs can use this function to decode a time, 1842Programs can use this function to decode a time,
1836since the number of columns in each field is fixed. 1843since the number of columns in each field is fixed
1844if the year is in the range 1000-9999.
1837The format is `Sun Sep 16 01:03:52 1973'. 1845The format is `Sun Sep 16 01:03:52 1973'.
1838However, see also the functions `decode-time' and `format-time-string' 1846However, see also the functions `decode-time' and `format-time-string'
1839which provide a much more powerful and general facility. 1847which 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.