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>
Mon, 30 Mar 2015 05:15:45 +0000 (01:15 -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.

(cherry picked from commit 08b996d180323775d5457944eefbb8a51ea72539)

src/time/__tz.c

index f56ef3053d09f762d9a7d76e32adb30f1e65dd82..17d1adff093236377387ec6de7e24311892d3b87 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])