Update.
[kopensolaris-gnu/glibc.git] / time / tzfile.c
index 1bce14c..cfbdae6 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991, 92, 93, 95, 96, 97, 98 Free Software Foundation, Inc.
+/* Copyright (C) 1991,92,93,95,96,97,98,99 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -44,8 +44,6 @@ struct leap
     long int change;           /* Seconds of correction to apply.  */
   };
 
-extern char * __tzstring (const char *); /* Defined in tzset.c.  */
-
 static struct ttinfo *find_transition (time_t timer) internal_function;
 static void compute_tzname_max (size_t) internal_function;
 
@@ -230,6 +228,8 @@ __tzfile_read (const char *file)
          || fread_unlocked (&types[i].isdst, 1, 1, f) != 1
          || fread_unlocked (&types[i].idx, 1, 1, f) != 1)
        goto lose;
+      if (types[i].isdst > 1)
+       goto lose;
       if (types[i].idx >= chars) /* Bogus index in data file.  */
        goto lose;
       types[i].offset = (long int) decode (x);
@@ -284,10 +284,11 @@ __tzfile_read (const char *file)
     {
       int type = type_idxs[--i];
       int dst = types[type].isdst;
-      int idx = types[type].idx;
 
       if (__tzname[dst] == NULL)
        {
+         int idx = types[type].idx;
+
          __tzname[dst] = __tzstring (&zone_names[idx]);
 
          if (__tzname[1 - dst] != NULL)
@@ -307,20 +308,32 @@ __tzfile_read (const char *file)
   compute_tzname_max (chars);
 
   if (num_transitions == 0)
-    /* Use the first rule (which should also be the only one.  */
+    /* Use the first rule (which should also be the only one).  */
     rule_stdoff = rule_dstoff = types[0].offset;
   else
     {
+      int stdoff_set = 0, dstoff_set = 0;
       rule_stdoff = rule_dstoff = 0;
-      for (i = 0; i < num_transitions; ++i)
+      i = num_transitions - 1;
+      do
        {
-         if (!rule_stdoff && !types[type_idxs[i]].isdst)
-           rule_stdoff = types[type_idxs[i]].offset;
-         if (!rule_dstoff && types[type_idxs[i]].isdst)
-           rule_dstoff = types[type_idxs[i]].offset;
-         if (rule_stdoff && rule_dstoff)
+         if (!stdoff_set && !types[type_idxs[i]].isdst)
+           {
+             stdoff_set = 1;
+             rule_stdoff = types[type_idxs[i]].offset;
+           }
+         else if (!dstoff_set && types[type_idxs[i]].isdst)
+           {
+             dstoff_set = 1;
+             rule_dstoff = types[type_idxs[i]].offset;
+           }
+         if (stdoff_set && dstoff_set)
            break;
        }
+      while (i-- > 0);
+
+      if (!dstoff_set)
+       rule_dstoff = rule_stdoff;
     }
 
   __daylight = rule_stdoff != rule_dstoff;
@@ -528,8 +541,6 @@ static void
 internal_function
 compute_tzname_max (size_t chars)
 {
-  extern size_t __tzname_cur_max; /* Defined in tzset.c. */
-
   const char *p;
 
   p = zone_names;