* time/tzset.c (tzset_internal): Correct parsing of TZ envvar.

This commit is contained in:
Ulrich Drepper 2009-02-24 22:45:58 +00:00
parent 77c571dd9c
commit 82780cbee5
2 changed files with 43 additions and 9 deletions

View File

@ -1,3 +1,7 @@
2009-02-24 Ulrich Drepper <drepper@redhat.com>
* time/tzset.c (tzset_internal): Correct parsing of TZ envvar.
2009-02-22 Ulrich Drepper <drepper@redhat.com>
* po/bg.po: Update from translation team.

View File

@ -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;