From 82780cbee540bc7e61de6eb165d0f3ec7aa9e549 Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Tue, 24 Feb 2009 22:45:58 +0000 Subject: [PATCH] * time/tzset.c (tzset_internal): Correct parsing of TZ envvar. --- ChangeLog | 4 ++++ time/tzset.c | 48 +++++++++++++++++++++++++++++++++++++++--------- 2 files changed, 43 insertions(+), 9 deletions(-) diff --git a/ChangeLog b/ChangeLog index 5a57459f10..aff3e72425 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2009-02-24 Ulrich Drepper + + * time/tzset.c (tzset_internal): Correct parsing of TZ envvar. + 2009-02-22 Ulrich Drepper * po/bg.po: Update from translation team. diff --git a/time/tzset.c b/time/tzset.c index 45d70518a8..5cde0bfbd5 100644 --- a/time/tzset.c +++ b/time/tzset.c @@ -174,14 +174,26 @@ __tzset_parse_tz (tz) /* Get the standard timezone name. */ tzbuf = strdupa (tz); - if (sscanf (tz, "%[^0-9,+-]", tzbuf) != 1 || - (l = strlen (tzbuf)) < 3) + if (sscanf (tz, "%[A-Za-z]", tzbuf) != 1) + { + /* Check for the quoted version. */ + char *wp = tzbuf; + if (*tz++ != '<') + goto out; + + while (isalnum (*tz) || *tz == '+' || *tz == '-') + *wp++ = *tz++; + if (*tz++ != '>' || wp - tzbuf < 3) + goto out; + *wp = '\0'; + } + else if ((l = strlen (tzbuf)) < 3) goto out; + else + tz += l; tz_rules[0].name = __tzstring (tzbuf); - tz += l; - /* Figure out the standard offset from UTC. */ if (*tz == '\0' || (*tz != '+' && *tz != '-' && !isdigit (*tz))) goto out; @@ -217,14 +229,32 @@ __tzset_parse_tz (tz) if (*tz != '\0') { char *n = tzbuf + strlen (tzbuf) + 1; - if (sscanf (tz, "%[^0-9,+-]", n) != 1 || - (l = strlen (n)) < 3) - goto done_names; /* Punt on name, set up the offsets. */ + + if (sscanf (tz, "%[A-Za-z]", tzbuf) != 1) + { + /* Check for the quoted version. */ + char *wp = tzbuf; + const char *rp = tz; + if (*rp++ != '<') + /* Punt on name, set up the offsets. */ + goto done_names; + + while (isalnum (*rp) || *rp == '+' || *rp == '-') + *wp++ = *rp++; + if (*rp++ != '>' || wp - tzbuf < 3) + /* Punt on name, set up the offsets. */ + goto done_names; + *wp = '\0'; + tz = rp; + } + else if ((l = strlen (tzbuf)) < 3) + /* Punt on name, set up the offsets. */ + goto done_names; + else + tz += l; tz_rules[1].name = __tzstring (n); - tz += l; - /* Figure out the DST offset from GMT. */ if (*tz == '-' || *tz == '+') tz_rules[1].offset = *tz++ == '-' ? 1L : -1L;