|
Message-ID: <20180915011634.GP1878@brightrain.aerifal.cx> Date: Fri, 14 Sep 2018 21:16:34 -0400 From: Rich Felker <dalias@...c.org> To: musl@...ts.openwall.com Subject: Re: [PATCH] always reset DST rules during tzset On Fri, Sep 14, 2018 at 03:46:55PM -0700, Benjamin Peterson wrote: > do_tzset() did't always reset the DST transition rules r0 and r1. That means the > rules from older TZ settings could leak into newer ones. > > The following program demonstrates this bug. It should print out the same > timezone twice but doesn't due to the leaky state. > > int main() { > time_t t = 0; > struct tm p; > setenv("TZ", "STD-1DST", 1); > localtime_r(&t, &p); > printf("%s\n", p.tm_zone); > setenv("TZ", "STD-1DST,M3.2.0,M11.1.0", 1); > tzset(); > setenv("TZ", "STD-1DST", 1); > localtime_r(&t, &p); > printf("%s\n", p.tm_zone); > return 0; > } > --- > src/time/__tz.c | 4 +++- > 1 file changed, 3 insertions(+), 1 deletion(-) > > diff --git a/src/time/__tz.c b/src/time/__tz.c > index 51e66514..3ccfdd5d 100644 > --- a/src/time/__tz.c > +++ b/src/time/__tz.c > @@ -130,6 +130,9 @@ static void do_tzset() > > if (old_tz && !strcmp(s, old_tz)) return; > > + memset(r0, 0, sizeof r0); > + memset(r1, 0, sizeof r1); > + > if (zi) __munmap((void *)zi, map_size); > > /* Cache the old value of TZ to check if it has changed. Avoid > @@ -194,7 +197,6 @@ static void do_tzset() > const unsigned char *p; > __tzname[0] = __tzname[1] = 0; > __daylight = __timezone = dst_off = 0; > - for (i=0; i<5; i++) r0[i] = r1[i] = 0; > for (p=types; p<abbrevs; p+=6) { > if (!p[4] && !__tzname[0]) { > __tzname[0] = (char *)abbrevs + p[5]; > -- > 2.17.1 This looks right, but is there a reason you swapped the for loop out for memsets? Either should work, but I probably preferred the loop in the original since, due to -ffreestanding which is necessary when building a libc, the compiler can't inline the memset automatically with a builtin. I might however use the new header wrapper framework to make it so (dependent on __GNUC__) memcpy and memset get redirected to the __builtin_* versions except in the source files that define them, in which case this kind of thing wouldn't matter. Rich
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.