[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 6/6] strftime: fix newly-introduced bug on Solaris
From: |
Paul Eggert |
Subject: |
[PATCH 6/6] strftime: fix newly-introduced bug on Solaris |
Date: |
Sat, 25 Jul 2015 18:21:58 -0700 |
* lib/strftime.c (strftime_case_): Set the local variable 'zone'
consistently at the start, rather than doing some of the setup at
the start and some in the %Z format spec. This is cleaner, and
works better with time_rz on platforms like Solaris where struct
tm lacks a tm_zone member, as when !HAVE_TM_GMTOFF %z's calls to
mktime_z and localtime_rz can mess up the tzname cache.
---
ChangeLog | 8 ++++++++
lib/strftime.c | 13 +++++--------
2 files changed, 13 insertions(+), 8 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index 230c646..9787fda 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,13 @@
2015-07-25 Paul Eggert <address@hidden>
+ strftime: fix newly-introduced bug on Solaris
+ * lib/strftime.c (strftime_case_): Set the local variable 'zone'
+ consistently at the start, rather than doing some of the setup at
+ the start and some in the %Z format spec. This is cleaner, and
+ works better with time_rz on platforms like Solaris where struct
+ tm lacks a tm_zone member, as when !HAVE_TM_GMTOFF %z's calls to
+ mktime_z and localtime_rz can mess up the tzname cache.
+
test-strftime: test for Solaris bug
* modules/strftime-tests (Depends-on): Add strerror.
* tests/test-strftime.c: Include <errno.h>.
diff --git a/lib/strftime.c b/lib/strftime.c
index 3cc8477..c7cec26 100644
--- a/lib/strftime.c
+++ b/lib/strftime.c
@@ -481,7 +481,12 @@ strftime_case_ (bool upcase, STREAM_OR_CHAR_T *s,
tzset ();
# endif
}
+ /* The tzset() call might have changed the value. */
+ if (!(zone && *zone) && tp->tm_isdst >= 0)
+ zone = tzname[tp->tm_isdst != 0];
#endif
+ if (! zone)
+ zone = "";
if (hour12 > 12)
hour12 -= 12;
@@ -1304,14 +1309,6 @@ strftime_case_ (bool upcase, STREAM_OR_CHAR_T *s,
to_lowcase = true;
}
-#if HAVE_TZNAME
- /* The tzset() call might have changed the value. */
- if (!(zone && *zone) && tp->tm_isdst >= 0)
- zone = tzname[tp->tm_isdst != 0];
-#endif
- if (! zone)
- zone = "";
-
#ifdef COMPILE_WIDE
{
/* The zone string is always given in multibyte form. We have
--
2.1.0