179894
commit c36f64aa6dff13b12a1e03a185e75a50fa9f6a4c
179894
Author: Hans-Peter Nilsson <hp@axis.com>
179894
Date:   Fri Dec 17 21:38:00 2021 +0100
179894
179894
    timezone: handle truncated timezones from tzcode-2021d and later (BZ #28707)
179894
    
179894
    When using a timezone file with a truncated starting time,
179894
    generated by the zic in IANA tzcode-2021d a.k.a. tzlib-2021d
179894
    (also in tzlib-2021e; current as of this writing), glibc
179894
    asserts in __tzfile_read (on e.g. tzset() for this file) and
179894
    you may find lines matching "tzfile.c:435: __tzfile_read:
179894
    Assertion `num_types == 1' failed" in your syslog.
179894
    
179894
    One example of such a file is the tzfile for Asuncion
179894
    generated by tzlib-2021e as follows, using the tzlib-2021e zic:
179894
    "zic -d DEST -r @1546300800 -L /dev/null -b slim
179894
    SOURCE/southamerica".  Note that in its type 2 header, it has
179894
    two entries in its "time-types" array (types), but only one
179894
    entry in its "transition types" array (type_idxs).
179894
    
179894
    This is valid and expected already in the published RFC8536, and
179894
    not even frowned upon: "Local time for timestamps before the
179894
    first transition is specified by the first time type (time type
179894
    0)" ... "every nonzero local time type index SHOULD appear at
179894
    least once in the transition type array".  Note the "nonzero ...
179894
    index".  Until the 2021d zic, index 0 has been shared by the
179894
    first valid transition but with 2021d it's separate, set apart
179894
    as a placeholder and only "implicitly" indexed.  (A draft update
179894
    of the RFC mandates that the entry at index 0 is a placeholder
179894
    in this case, hence can no longer be shared.)
179894
    
179894
            * time/tzfile.c (__tzfile_read): Don't assert when no transitions
179894
            are found.
179894
    
179894
    Co-authored-by: Christopher Wong <Christopher.Wong@axis.com>
179894
179894
diff --git a/time/tzfile.c b/time/tzfile.c
179894
index 190a777152..8668392ad3 100644
179894
--- a/time/tzfile.c
179894
+++ b/time/tzfile.c
179894
@@ -431,8 +431,8 @@ __tzfile_read (const char *file, size_t extra, char **extrap)
179894
   if (__tzname[0] == NULL)
179894
     {
179894
       /* This should only happen if there are no transition rules.
179894
-	 In this case there should be only one single type.  */
179894
-      assert (num_types == 1);
179894
+	 In this case there's usually only one single type, unless
179894
+	 e.g. the data file has a truncated time-range.  */
179894
       __tzname[0] = __tzstring (zone_names);
179894
     }
179894
   if (__tzname[1] == NULL)