diff options
| author | Rich Felker <dalias@aerifal.cx> | 2014-10-09 23:44:02 -0400 | 
|---|---|---|
| committer | Rich Felker <dalias@aerifal.cx> | 2014-10-09 23:44:02 -0400 | 
| commit | 08b996d180323775d5457944eefbb8a51ea72539 (patch) | |
| tree | b2cc448f2b8bc4444b447999393f7308a9436cd3 | |
| parent | a3763d64e0d65ed1902b36c521c57cd252b9c3be (diff) | |
| download | musl-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.
| -rw-r--r-- | src/time/__tz.c | 17 | 
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]) | 
