about summary refs log tree commit diff
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2009-03-10 15:23:46 +0000
committerUlrich Drepper <drepper@redhat.com>2009-03-10 15:23:46 +0000
commit686f8c9daf0ee99cf24894747987376577efa612 (patch)
treea8af6b7281fed13ae655daed6d98a44037bd170f
parent7db0cc42453f96dd52a972bdcaaa6e79fd96059c (diff)
downloadglibc-686f8c9daf0ee99cf24894747987376577efa612.tar.gz
glibc-686f8c9daf0ee99cf24894747987376577efa612.tar.xz
glibc-686f8c9daf0ee99cf24894747987376577efa612.zip
* time/tzset.c (__tzset_parse_tz): Use correct string when parsing
	DST name.
	* time/tst-posixtz.c: Add tests for quoted timezone names.
-rw-r--r--ChangeLog6
-rw-r--r--time/tst-posixtz.c30
-rw-r--r--time/tzset.c21
3 files changed, 45 insertions, 12 deletions
diff --git a/ChangeLog b/ChangeLog
index f9b227615f..7ba1e43df6 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2009-03-10  Ulrich Drepper  <drepper@redhat.com>
+
+	* time/tzset.c (__tzset_parse_tz): Use correct string when parsing
+	DST name.
+	* time/tst-posixtz.c: Add tests for quoted timezone names.
+
 2009-03-10  Jakub Jelinek  <jakub@redhat.com>
 
 	* posix/unistd.h (_POSIX_VERSION, _POSIX2_VERSION, _POSIX2_C_BIND,
diff --git a/time/tst-posixtz.c b/time/tst-posixtz.c
index ccba63e5b4..019d92ada0 100644
--- a/time/tst-posixtz.c
+++ b/time/tst-posixtz.c
@@ -18,6 +18,10 @@ struct
     "1999/02/26 07:18:12 dst=1 zone=AEDST" },
   { 909312849L, "EST+5EDT,M4.1.0/2,M10.5.0/2",
     "1998/10/25 05:54:09 dst=0 zone=EST" },
+  { 909312849L, "EST5EDT,M4.1.0/2,M10.5.0/2",
+    "1998/10/25 05:54:09 dst=0 zone=EST" },
+  { 909312849L, "<EST5>5EDT,M4.1.0/2,M10.5.0/2",
+    "1998/10/25 05:54:09 dst=0 zone=EST5" },
   { 924864849L, "EST+5EDT,M4.1.0/2,M10.5.0/2",
     "1999/04/23 06:54:09 dst=1 zone=EDT" },
   { 919973892L, "EST+5EDT,M4.1.0/2,M10.5.0/2",
@@ -84,5 +88,31 @@ main (void)
       puts (", FAIL");
     }
 
+  setenv ("TZ", "<AB1>-10<AB2>-11,M10.5.0,M3.5.0", 1);
+  tzset ();
+  printf ("TZ = \"<AB1>-10<AB2>-11,M10.5.0,M3.5.0\" daylight %d"
+	  " tzname = { \"%s\", \"%s\" }", daylight, tzname[0], tzname[1]);
+  if (daylight
+      && strcmp (tzname[0], "AB1") == 0 && strcmp (tzname[1], "AB2") == 0)
+    puts (", OK");
+  else
+    {
+      result = 1;
+      puts (", FAIL");
+    }
+
+  setenv ("TZ", "<BB1>-10", 1);
+  tzset ();
+  printf ("TZ = \"<BB1>-10\" daylight %d"
+	  " tzname = { \"%s\", \"%s\" }", daylight, tzname[0], tzname[1]);
+  if (daylight == 0
+      && strcmp (tzname[0], "BB1") == 0 && strcmp (tzname[1], "BB1") == 0)
+    puts (", OK");
+  else
+    {
+      result = 1;
+      puts (", FAIL");
+    }
+
   return result;
 }
diff --git a/time/tzset.c b/time/tzset.c
index 5cde0bfbd5..883a7ba1f0 100644
--- a/time/tzset.c
+++ b/time/tzset.c
@@ -163,7 +163,6 @@ __tzset_parse_tz (tz)
      const char *tz;
 {
   register size_t l;
-  char *tzbuf;
   unsigned short int hh, mm, ss;
   unsigned short int whichrule;
 
@@ -172,22 +171,22 @@ __tzset_parse_tz (tz)
   tz_rules[0].name = tz_rules[1].name = "";
 
   /* Get the standard timezone name.  */
-  tzbuf = strdupa (tz);
+  char *tzbuf = strdupa (tz);
 
   if (sscanf (tz, "%[A-Za-z]", tzbuf) != 1)
     {
       /* Check for the quoted version.  */
       char *wp = tzbuf;
-      if (*tz++ != '<')
+      if (__builtin_expect (*tz++ != '<', 0))
 	goto out;
 
       while (isalnum (*tz) || *tz == '+' || *tz == '-')
 	*wp++ = *tz++;
-      if (*tz++ != '>' || wp - tzbuf < 3)
+      if (__builtin_expect (*tz++ != '>' || wp - tzbuf < 3, 0))
 	goto out;
       *wp = '\0';
     }
-  else if ((l = strlen (tzbuf)) < 3)
+  else if (__builtin_expect ((l = strlen (tzbuf)) < 3, 0))
     goto out;
   else
     tz += l;
@@ -219,7 +218,7 @@ __tzset_parse_tz (tz)
 
   for (l = 0; l < 3; ++l)
     {
-      while (isdigit(*tz))
+      while (isdigit (*tz))
 	++tz;
       if (l < 2 && *tz == ':')
 	++tz;
@@ -228,32 +227,30 @@ __tzset_parse_tz (tz)
   /* Get the DST timezone name (if any).  */
   if (*tz != '\0')
     {
-      char *n = tzbuf + strlen (tzbuf) + 1;
-
       if (sscanf (tz, "%[A-Za-z]", tzbuf) != 1)
 	{
 	  /* Check for the quoted version.  */
 	  char *wp = tzbuf;
 	  const char *rp = tz;
-	  if (*rp++ != '<')
+	  if (__builtin_expect (*rp++ != '<', 0))
 	    /* Punt on name, set up the offsets.  */
 	    goto done_names;
 
 	  while (isalnum (*rp) || *rp == '+' || *rp == '-')
 	    *wp++ = *rp++;
-	  if (*rp++ != '>' || wp - tzbuf < 3)
+	  if (__builtin_expect (*rp++ != '>' || wp - tzbuf < 3, 0))
 	    /* Punt on name, set up the offsets.  */
 	    goto done_names;
 	  *wp = '\0';
 	  tz = rp;
 	}
-      else if ((l = strlen (tzbuf)) < 3)
+      else if (__builtin_expect ((l = strlen (tzbuf)) < 3, 0))
 	/* Punt on name, set up the offsets.  */
 	goto done_names;
       else
 	tz += l;
 
-      tz_rules[1].name = __tzstring (n);
+      tz_rules[1].name = __tzstring (tzbuf);
 
       /* Figure out the DST offset from GMT.  */
       if (*tz == '-' || *tz == '+')