summaryrefslogtreecommitdiff
path: root/src/time
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2014-10-09 23:44:02 -0400
committerRich Felker <dalias@aerifal.cx>2014-10-09 23:44:02 -0400
commit08b996d180323775d5457944eefbb8a51ea72539 (patch)
treeb2cc448f2b8bc4444b447999393f7308a9436cd3 /src/time
parenta3763d64e0d65ed1902b36c521c57cd252b9c3be (diff)
downloadmusl-08b996d180323775d5457944eefbb8a51ea72539.tar.gz
fix handling of negative offsets in timezone spec strings
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.
Diffstat (limited to 'src/time')
-rw-r--r--src/time/__tz.c17
1 files changed, 7 insertions, 10 deletions
diff --git a/src/time/__tz.c b/src/time/__tz.c
index 92c43a57..4ce20258 100644
--- a/src/time/__tz.c
+++ b/src/time/__tz.c
@@ -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])