[tz] [PATCH 7/7] Port zdump to right_only installations

Paul Eggert eggert at cs.ucla.edu
Wed Mar 17 01:46:05 UTC 2021


Without this fix, on the rare installations where time_t counts
leap seconds (e.g., make REDO=right_only), ‘zdump -v
America/Los_Angeles’ would output a transition like this:
Sun Jan  1 00:00:26 2017 UT = Sat Dec 31 16:59:60 2016 PDT
Sun Jan  1 00:00:27 2017 UT = Sat Dec 31 17:00:00 2016 PDT
which is incorrect, as the left-hand column is TAI, not UT.
With this patch, the same command outputs this instead:
Sat Dec 31 23:59:60 2016 UT = Sat Dec 31 16:59:60 2016 PDT
Sun Jan  1 00:00:00 2017 UT = Sat Dec 31 17:00:00 2016 PDT
* NEWS: Mention this.
* zdump.c (gmtzinit): Try "GMT" and fall back on "GMT0"
rather than using "UTC0".
---
 NEWS    |  4 ++++
 zdump.c | 20 ++++++++++++++++----
 2 files changed, 20 insertions(+), 4 deletions(-)

diff --git a/NEWS b/NEWS
index 559e96e..bccd6c2 100644
--- a/NEWS
+++ b/NEWS
@@ -86,6 +86,10 @@ Unreleased, experimental changes
     "EST5EDT,0/0,J365/25" or "".  (Thanks to Michael Deckers for
     noting the possibility of POSIX conformance.)
 
+    When reading slim TZif files, zdump no longer mishandles leap
+    seconds on the rare platforms where time_t counts leap seconds,
+    fixing a bug introduced in 2014g.
+
     zdump's -c and -t options are now consistently inclusive for the
     lower time bound and exclusive for the upper.  Formerly they were
     inconsistent.  (Confusion noted by Martin Burnicki.)
diff --git a/zdump.c b/zdump.c
index c29f059..dcad817 100644
--- a/zdump.c
+++ b/zdump.c
@@ -259,11 +259,23 @@ static void
 gmtzinit(void)
 {
   if (USE_LOCALTIME_RZ) {
-    static char const utc[] = "UTC0";
-    gmtz = tzalloc(utc);
+    /* Try "GMT" first to find out whether this is one of the rare
+       platforms where time_t counts leap seconds; this works due to
+       the "Link Etc/GMT GMT" line in the "etcetera" file.  If "GMT"
+       fails, fall back on "GMT0" which might be similar due to the
+       "Link Etc/GMT GMT0" line in the "backward" file, and which
+       should work on all POSIX platforms.  The rest of zdump does not
+       use the "GMT" abbreviation that comes from this setting, so it
+       is OK to use "GMT" here rather than the more-modern "UTC" which
+       would not work on platforms that omit the "backward" file.  */
+    gmtz = tzalloc("GMT");
     if (!gmtz) {
-      perror(utc);
-      exit(EXIT_FAILURE);
+      static char const gmt0[] = "GMT0";
+      gmtz = tzalloc(gmt0);
+      if (!gmtz) {
+	perror(gmt0);
+	exit(EXIT_FAILURE);
+      }
     }
   }
 }
-- 
2.27.0



More information about the tz mailing list