* 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 <egg...@cs.ucla.edu> + 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