[J. Wunsch: hey (fwd)]

Garrett Wollman wollman at lcs.mit.edu
Mon Jan 13 17:03:49 UTC 1997


<<On Fri, 10 Jan 1997 15:38:45 -0800, Paul Eggert <eggert at twinsun.com> said:

> That is the best way, and in fact the tz code is supposed to do that
> already.  I just took a quick look and I couldn't see any holes in its
> checking, though I didn't look that carefully.  

It turns out that it is doing the proper checking, but it is not doing
a good job of cleaning up the mess.  Here are more segments of my
debugging typescript:

gmtload (sp=0x24124) at /usr/wd1/src/lib/libc/stdtime/localtime.c:921
921                     (void) tzparse(gmt, sp, TRUE);
(gdb) s
tzparse (name=0x128d0 "GMT", sp=0x24124, lastditch=1)
    at /usr/wd1/src/lib/libc/stdtime/localtime.c:720
720             INITIALIZE(dstname);
(gdb) 
721             stdname = name;
(gdb) 
722             if (lastditch) {
(gdb) 
723                     stdlen = strlen(name);  /* length of standard zone name */
(gdb) 
724                     name += stdlen;
(gdb) 
725                     if (stdlen >= sizeof sp->chars)
(gdb) 
727             } else {
(gdb) 
733             if (*name == '\0')
(gdb) 
734                     return -1;      /* was "stdoffset = 0;" */
(gdb) p *sp
$13 = {leapcnt = 1919905652, timecnt = 544173600, typecnt = 1802002806, 
  charcnt = 1919512165, ats = {0 <repeats 370 times>}, 
  types = '\000' <repeats 369 times>, ttis = {{tt_gmtoff = 0, tt_isdst = 0, 
      tt_abbrind = 0, tt_ttisstd = 0, tt_ttisgmt = 0} <repeats 256 times>}, 
  chars = '\000' <repeats 511 times>, lsis = {{ls_trans = 0, 
      ls_corr = 0} <repeats 50 times>}}
(gdb) n
914     }
(gdb) 
gmtload (sp=0x24124) at /usr/wd1/src/lib/libc/stdtime/localtime.c:922
922     }
(gdb) 
tzset () at /usr/wd1/src/lib/libc/stdtime/localtime.c:1010
1010            settzname();
(gdb) 

(and of course, settzname() is where it already blows up...)  Line 734
above appears to be the error; it doesn't take into account the
possibility that this is a `lasatditch' attempt.

The following patch appears to fix the problem:

--- localtime.c.ORIG    Mon Jan 13 12:00:35 1997
+++ localtime.c Mon Jan 13 12:01:20 1997
@@ -724,18 +724,19 @@
                name += stdlen;
                if (stdlen >= sizeof sp->chars)
                        stdlen = (sizeof sp->chars) - 1;
+               stdoffset = 0;
        } else {
                name = getzname(name);
                stdlen = name - stdname;
                if (stdlen < 3)
                        return -1;
-       }
-       if (*name == '\0')
-               return -1;      /* was "stdoffset = 0;" */
-       else {
-               name = getoffset(name, &stdoffset);
-               if (name == NULL)
-                       return -1;
+               if (*name == '\0')
+                       return -1;      /* was "stdoffset = 0;" */
+               else {
+                       name = getoffset(name, &stdoffset);
+                       if (name == NULL)
+                               return -1;
+               }
        }
        load_result = tzload(TZDEFRULES, sp);
        if (load_result != 0)


-GAWollman

--
Garrett A. Wollman   | O Siem / We are all family / O Siem / We're all the same
wollman at lcs.mit.edu  | O Siem / The fires of freedom 
Opinions not those of| Dance in the burning flame
MIT, LCS, ANA, or NSA|                     - Susan Aglukark and Chad Irschick



More information about the tz mailing list