* time/tzset.c (tzset_internal): Correct parsing of TZ envvar.
authorUlrich Drepper <drepper@redhat.com>
Tue, 24 Feb 2009 22:45:58 +0000 (22:45 +0000)
committerUlrich Drepper <drepper@redhat.com>
Tue, 24 Feb 2009 22:45:58 +0000 (22:45 +0000)
ChangeLog
time/tzset.c

index 5a57459..aff3e72 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -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.
index 45d7051..5cde0bf 100644 (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,13 +229,31 @@ __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.  */
 
-      tz_rules[1].name = __tzstring (n);
+      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 += l;
+      tz_rules[1].name = __tzstring (n);
 
       /* Figure out the DST offset from GMT.  */
       if (*tz == '-' || *tz == '+')