fix handling of negative offsets in timezone spec strings
authorRich Felker <dalias@aerifal.cx>
Fri, 10 Oct 2014 03:44:02 +0000 (23:44 -0400)
committerRich Felker <dalias@aerifal.cx>
Fri, 10 Oct 2014 03:44:02 +0000 (23:44 -0400)
previously, the hours were considered as a signed quantity while
minutes and seconds were always treated as positive offsets. however,
semantically the '-' sign should negate the whole hh:mm:ss offset.
this bug only affected timezones east of GMT with non-whole-hours
offsets, such as those used in India and Nepal.

src/time/__tz.c

index 92c43a570a914641cb8ae8e6cb6733cacc1b1dd9..4ce20258f126123cc0c6221a6e5465f2a94c65bf 100644 (file)
@@ -36,19 +36,16 @@ static int getint(const char **p)
        return x;
 }
 
-static int getsigned(const char **p)
+static int getoff(const char **p)
 {
+       int neg = 0;
        if (**p == '-') {
                ++*p;
-               return -getint(p);
+               neg = 1;
+       } else if (**p == '+') {
+               ++*p;
        }
-       if (**p == '+') ++*p;
-       return getint(p);
-}
-
-static int getoff(const char **p)
-{
-       int off = 3600*getsigned(p);
+       int off = 3600*getint(p);
        if (**p == ':') {
                ++*p;
                off += 60*getint(p);
@@ -57,7 +54,7 @@ static int getoff(const char **p)
                        off += getint(p);
                }
        }
-       return off;
+       return neg ? -off : off;
 }
 
 static void getrule(const char **p, int rule[5])