[1/2] time: in strptime(), make %z accept Z as a time zone [BZ #17886]

Message ID 87mvwl5vl3.fsf@zoro.exoscale.ch
State Committed
Delegated to: Mike Frysinger
Headers

Commit Message

Vincent Bernat Sept. 17, 2015, 7:55 a.m. UTC
  ❦ 16 septembre 2015 13:16 -0400, Mike Frysinger <vapier@gentoo.org> :

>> --- a/time/tst-strptime2.c
>> +++ b/time/tst-strptime2.c
>
> the mkbuf function has a comment block that needs updating since it
> discusses valid inputs for timezone offsets.

OK, updated.
  

Comments

Mike Frysinger Sept. 18, 2015, 6:33 a.m. UTC | #1
On 17 Sep 2015 09:55, Vincent Bernat wrote:
>  ❦ 16 septembre 2015 13:16 -0400, Mike Frysinger <vapier@gentoo.org> :
> 
> >> --- a/time/tst-strptime2.c
> >> +++ b/time/tst-strptime2.c
> >
> > the mkbuf function has a comment block that needs updating since it
> > discusses valid inputs for timezone offsets.
> 
> OK, updated.

thanks, pushed both now !
-mike
  

Patch

From f860e2622d8079b205c51c4cb9483d10c0da8fc5 Mon Sep 17 00:00:00 2001
From: Vincent Bernat <vincent@bernat.im>
Date: Tue, 27 Jan 2015 15:58:07 +0100
Subject: [PATCH 1/2] time: in strptime(), make %z accept Z as a time zone [BZ
 #17886]

In ISO 8601, the timezone can be 'Z' instead of using
digits. 2014-08-17T12:33:12+0000 is often expressed as
2014-08-17T12:33:12Z.

This fixes BZ #17886.

2015-09-16  Vincent Bernat  <vincent@bernat.im>

	[BZ #17886]
	* time/strptime_l.c (__strptime_internal): Make %z accept Z as a
	valid time zone.
---
 time/strptime_l.c    | 10 ++++++++--
 time/tst-strptime2.c | 10 +++++++++-
 2 files changed, 17 insertions(+), 3 deletions(-)

diff --git a/time/strptime_l.c b/time/strptime_l.c
index 4203ad81a0f3..989edd6144e6 100644
--- a/time/strptime_l.c
+++ b/time/strptime_l.c
@@ -749,13 +749,19 @@  __strptime_internal (rp, fmt, tmp, statep LOCALE_PARAM)
 	    rp++;
 	  break;
 	case 'z':
-	  /* We recognize two formats: if two digits are given, these
+	  /* We recognize three formats: if two digits are given, these
 	     specify hours.  If fours digits are used, minutes are
-	     also specified.  */
+	     also specified.  'Z' is equivalent to +0000.  */
 	  {
 	    val = 0;
 	    while (ISSPACE (*rp))
 	      ++rp;
+	    if (*rp == 'Z')
+	      {
+		++rp;
+		tm->tm_gmtoff = 0;
+		break;
+	      }
 	    if (*rp != '+' && *rp != '-')
 	      return NULL;
 	    bool neg = *rp++ == '-';
diff --git a/time/tst-strptime2.c b/time/tst-strptime2.c
index 5b06a63ba4c3..3d906dec74e7 100644
--- a/time/tst-strptime2.c
+++ b/time/tst-strptime2.c
@@ -31,7 +31,8 @@  static bool verbose;
      whitespace matching strptime " " format specifier, and
      timezone string matching strptime "%z" format specifier.
 
-   Note that a valid timezone string contains the following fields:
+   Note that a valid timezone string is either "Z" or contains the
+   following fields:
      Sign field consisting of a '+' or '-' sign,
      Hours field in two decimal digits, and
      optional Minutes field in two decimal digits.
@@ -155,6 +156,13 @@  do_test (void)
   expect = LONG_MAX;
   result |= compare (buf, expect, nresult);
 
+  /* Create and test input string with "Z" input (valid format).
+     Expect tm_gmtoff of 0.  */
+
+  sprintf (buf, "%s Z", dummy_string);
+  expect = 0;
+  result |= compare (buf, expect, nresult);
+
   /* Create and test input strings with sign and digits:
      0 digits (invalid format),
      1 digit (invalid format),
-- 
2.5.1