mirror of
git://git.musl-libc.org/musl
synced 2025-02-11 00:17:32 +00:00
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.
This commit is contained in:
parent
8e452abae6
commit
33338ebc85
@ -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__})
|
||||
|
Loading…
Reference in New Issue
Block a user