From 177ea5f115f2a11066c6ac2569eaf0e2f1461f49 Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Sun, 6 Sep 1998 15:49:17 +0000 Subject: [PATCH] (Fformat_time_string, Fdecode_time, Fcurrent_time_zone): Don't assume that localtime and gmtime return non-NULL. --- src/editfns.c | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/src/editfns.c b/src/editfns.c index 31324cfde6f..0e4f7ce540e 100644 --- a/src/editfns.c +++ b/src/editfns.c @@ -905,6 +905,7 @@ DEFUN ("format-time-string", Fformat_time_string, Sformat_time_string, 1, 3, 0, { time_t value; int size; + struct tm *tm; CHECK_STRING (format_string, 1); @@ -914,6 +915,10 @@ DEFUN ("format-time-string", Fformat_time_string, Sformat_time_string, 1, 3, 0, /* This is probably enough. */ size = STRING_BYTES (XSTRING (format_string)) * 6 + 50; + tm = NILP (universal) ? localtime (&value) : gmtime (&value); + if (! tm) + error ("Specified time is not representable"); + while (1) { char *buf = (char *) alloca (size + 1); @@ -921,15 +926,13 @@ DEFUN ("format-time-string", Fformat_time_string, Sformat_time_string, 1, 3, 0, buf[0] = '\1'; result = emacs_strftime (buf, size, XSTRING (format_string)->data, - (NILP (universal) ? localtime (&value) - : gmtime (&value))); + tm); if ((result > 0 && result < size) || (result == 0 && buf[0] == '\0')) return build_string (buf); /* If buffer was too small, make it bigger and try again. */ result = emacs_strftime (NULL, 0x7fffffff, XSTRING (format_string)->data, - (NILP (universal) ? localtime (&value) - : gmtime (&value))); + tm); size = result + 1; } } @@ -959,6 +962,8 @@ ZONE is an integer indicating the number of seconds east of Greenwich.\n\ error ("Invalid time specification"); decoded_time = localtime (&time_spec); + if (! decoded_time) + error ("Specified time is not representable"); XSETFASTINT (list_args[0], decoded_time->tm_sec); XSETFASTINT (list_args[1], decoded_time->tm_min); XSETFASTINT (list_args[2], decoded_time->tm_hour); @@ -1143,18 +1148,15 @@ the data it can't find.") { time_t value; struct tm *t; + struct tm gmt; if (lisp_time_argument (specified_time, &value) - && (t = gmtime (&value)) != 0) + && (t = gmtime (&value)) != 0 + && (gmt = *t, t = localtime (&value)) != 0) { - struct tm gmt; - int offset; - char *s, buf[6]; - - gmt = *t; /* Make a copy, in case localtime modifies *t. */ - t = localtime (&value); - offset = tm_diff (t, &gmt); - s = 0; + int offset = tm_diff (t, &gmt); + char *s = 0; + char buf[6]; #ifdef HAVE_TM_ZONE if (t->tm_zone) s = (char *)t->tm_zone; -- 2.39.2