summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog4
-rw-r--r--time/tzset.c48
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  <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.
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,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 == '+')