From fe699d375f07faf11ce057c9585327c6bdb05af4 Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Sat, 25 Jul 2015 16:37:17 -0700 Subject: [PATCH] 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. --- ChangeLog | 8 ++++++++ lib/strftime.c | 13 +++++-------- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/ChangeLog b/ChangeLog index 230c646c6e..9787fdaaf0 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,13 @@ 2015-07-25 Paul Eggert + 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 . diff --git a/lib/strftime.c b/lib/strftime.c index 3cc8477a59..c7cec2621c 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.39.5