about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog14
-rw-r--r--NEWS8
-rw-r--r--time/strptime_l.c12
-rw-r--r--time/tst-strptime2.c21
4 files changed, 40 insertions, 15 deletions
diff --git a/ChangeLog b/ChangeLog
index 287ab2db37..6c1f804fd2 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,17 @@
+2015-08-28  James Perkins  <james@loowit.net>
+
+	[BZ #16141]
+	* time/strptime_l.c (__strptime_internal): Fix %z minutes
+	calculation, removing incorrect decimal time rounding, so that
+	all minute values result in a valid seconds value.
+	* time/strptime_l.c (__strptime_internal): Extend %z time zone
+	offset range limits to UTC-99:59 through UTC+99:59 to parse
+	current and historical use cases.
+	* time/tst-strptime2.c (tests): Modify and add tests for the
+	strptime %z input field descriptor, specifically conversion of
+	minutes to seconds and validating an offset range of -9959 to
+	+9959.
+
 2015-08-27  Adhemerval Zanella  <adhemerval.zanella@linaro.org>
 	    Dmitry V. Levin  <ldv@altlinux.org>
 
diff --git a/NEWS b/NEWS
index af9fd8de2b..f70eb52972 100644
--- a/NEWS
+++ b/NEWS
@@ -9,10 +9,10 @@ Version 2.23
 
 * The following bugs are resolved with this release:
 
-  2898, 14341, 15786, 16517, 16519, 16520, 16734, 16973, 17787, 17905,
-  18084, 18086, 18240, 18265, 18370, 18421, 18480, 18525, 18610, 18618,
-  18647, 18661, 18674, 18681, 18778, 18781, 18787, 18789, 18790, 18795,
-  18796, 18820, 18823, 18824, 18863.
+  2898, 14341, 15786, 16141, 16517, 16519, 16520, 16734, 16973, 17787,
+  17905, 18084, 18086, 18240, 18265, 18370, 18421, 18480, 18525, 18610,
+  18618, 18647, 18661, 18674, 18681, 18778, 18781, 18787, 18789, 18790,
+  18795, 18796, 18820, 18823, 18824, 18863.
 
 * The obsolete header <regexp.h> has been removed.  Programs that require
   this header must be updated to use <regex.h> instead.
diff --git a/time/strptime_l.c b/time/strptime_l.c
index 5640ccecce..4203ad81a0 100644
--- a/time/strptime_l.c
+++ b/time/strptime_l.c
@@ -770,16 +770,10 @@ __strptime_internal (rp, fmt, tmp, statep LOCALE_PARAM)
 	    else if (n != 4)
 	      /* Only two or four digits recognized.  */
 	      return NULL;
-	    else
-	      {
-		/* We have to convert the minutes into decimal.  */
-		if (val % 100 >= 60)
-		  return NULL;
-		val = (val / 100) * 100 + ((val % 100) * 50) / 30;
-	      }
-	    if (val > 1200)
+	    else if (val % 100 >= 60)
+	      /* Minutes valid range is 0 through 59.  */
 	      return NULL;
-	    tm->tm_gmtoff = (val * 3600) / 100;
+	    tm->tm_gmtoff = (val / 100) * 3600 + (val % 100) * 60;
 	    if (neg)
 	      tm->tm_gmtoff = -tm->tm_gmtoff;
 	  }
diff --git a/time/tst-strptime2.c b/time/tst-strptime2.c
index a08e6d7cb7..4db8321291 100644
--- a/time/tst-strptime2.c
+++ b/time/tst-strptime2.c
@@ -17,8 +17,25 @@ static const struct
     { "1113472456 -1030", -37800 },
     { "1113472456 +0030", 1800 },
     { "1113472456 -0030", -1800 },
-    { "1113472456 -1330", LONG_MAX },
-    { "1113472456 +1330", LONG_MAX },
+    { "1113472456 +1157", 43020 },
+    { "1113472456 +1158", 43080 },
+    { "1113472456 +1159", 43140 },
+    { "1113472456 +1200", 43200 },
+    { "1113472456 -1200", -43200 },
+    { "1113472456 +1201", 43260 },
+    { "1113472456 -1201", -43260 },
+    { "1113472456 +1330", 48600 },
+    { "1113472456 -1330", -48600 },
+    { "1113472456 +1400", 50400 },
+    { "1113472456 +1401", 50460 },
+    { "1113472456 -2459", -89940 },
+    { "1113472456 -2500", -90000 },
+    { "1113472456 +2559", 93540 },
+    { "1113472456 +2600", 93600 },
+    { "1113472456 -99", -356400 },
+    { "1113472456 +99", 356400 },
+    { "1113472456 -9959", -359940 },
+    { "1113472456 +9959", 359940 },
     { "1113472456 -1060", LONG_MAX },
     { "1113472456 +1060", LONG_MAX },
     { "1113472456  1030", LONG_MAX },