|
Message-Id: <20200222220113.55710-2-samuel@sholland.org> Date: Sat, 22 Feb 2020 16:01:13 -0600 From: Samuel Holland <samuel@...lland.org> To: musl@...ts.openwall.com Cc: Samuel Holland <samuel@...lland.org> Subject: [PATCH 2/2] 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 was causing a failure in gnulib test-parse-datetime, which tries to use a timezone of 2000 "X"s followed by "0". --- src/time/__tz.c | 10 +++++----- 1 file 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__}) -- 2.24.1
Powered by blists - more mailing lists
Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.