diff options
author | Samuel Holland <samuel@sholland.org> | 2020-02-22 16:01:13 -0600 |
---|---|---|
committer | Rich Felker <dalias@aerifal.cx> | 2020-03-21 12:47:09 -0400 |
commit | 33338ebc853d37c80f0f236cc7a92cb0acc6aace (patch) | |
tree | ea0bdec858a89dbb17ec830a35ac94037e5dd566 | |
parent | 8e452abae67db445fb6c3e37cd566c4788c2e8f3 (diff) | |
download | musl-33338ebc853d37c80f0f236cc7a92cb0acc6aace.tar.gz musl-33338ebc853d37c80f0f236cc7a92cb0acc6aace.tar.bz2 musl-33338ebc853d37c80f0f236cc7a92cb0acc6aace.tar.xz musl-33338ebc853d37c80f0f236cc7a92cb0acc6aace.zip |
fix parsing offsets after long timezone names
TZ containg a timezone name with >TZNAME_MAX characters currently
breaks musl's timezone parsing. getname() stops after TZNAME_MAX
characters. getoff() will consume no characters (because the next
character is not a digit) and incorrectly return 0. Then, because
there are remaining alphabetic characters, __daylight == 1, and
dst_off == -3600.
getname() must consume the entire timezone name, even if it will not
fit in d/__tzname, so when it returns, s points to the offset digits.
-rw-r--r-- | src/time/__tz.c | 10 |
1 files changed, 5 insertions, 5 deletions
diff --git a/src/time/__tz.c b/src/time/__tz.c index a962960e..49a7371e 100644 --- a/src/time/__tz.c +++ b/src/time/__tz.c @@ -86,15 +86,15 @@ static void getname(char *d, const char **p) int i; if (**p == '<') { ++*p; - for (i=0; (*p)[i] && (*p)[i]!='>' && i<TZNAME_MAX; i++) - d[i] = (*p)[i]; + for (i=0; (*p)[i] && (*p)[i]!='>'; i++) + if (i<TZNAME_MAX) d[i] = (*p)[i]; if ((*p)[i]) ++*p; } else { - for (i=0; ((*p)[i]|32)-'a'<26U && i<TZNAME_MAX; i++) - d[i] = (*p)[i]; + for (i=0; ((*p)[i]|32)-'a'<26U; i++) + if (i<TZNAME_MAX) d[i] = (*p)[i]; } *p += i; - d[i] = 0; + d[i<TZNAME_MAX?i:TZNAME_MAX] = 0; } #define VEC(...) ((const unsigned char[]){__VA_ARGS__}) |