about summary refs log tree commit diff
path: root/time/strptime_l.c
diff options
context:
space:
mode:
authorDJ Delorie <dj@redhat.com>2019-03-27 17:44:51 -0400
committerDJ Delorie <dj@redhat.com>2019-04-01 14:19:16 -0400
commite0e4c321c3145b6ac0e8f6e894f87790cf9437ce (patch)
tree097f4b5ebbd34f57a945f24e6182b96d104b3165 /time/strptime_l.c
parent993e3107af67edefcfc79a62ae55f7b98aa5151e (diff)
downloadglibc-e0e4c321c3145b6ac0e8f6e894f87790cf9437ce.tar.gz
glibc-e0e4c321c3145b6ac0e8f6e894f87790cf9437ce.tar.xz
glibc-e0e4c321c3145b6ac0e8f6e894f87790cf9437ce.zip
Fix strptime era handling, add more strftime tests [BZ #24394]
Test the transition points between all the currently listed Japanese
era name changes. This includes testing the transition between the
first year date and the second year date. This test will help test
the upcoming Japanese era name change.

Also fixes a fencepost error where the era name isn't properly parsed
by strptime in the last (partial) year of the era.

Example: if an era change happens in Feb 1990, and again in Aug 1995,
that's 5.5 years long, but the 0.5 year wasn't accounted for.

Reviewed-by: Carlos O'Donell <carlos@redhat.com>
Diffstat (limited to 'time/strptime_l.c')
-rw-r--r--time/strptime_l.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/time/strptime_l.c b/time/strptime_l.c
index e19b9a15dd..7436a168b7 100644
--- a/time/strptime_l.c
+++ b/time/strptime_l.c
@@ -907,10 +907,15 @@ __strptime_internal (const char *rp, const char *fmt, struct tm *tmp,
 			{
 			  int delta = ((tm->tm_year - era->offset)
 				       * era->absolute_direction);
+			  /* The difference between two sets of years
+			     does not include the final year itself,
+			     therefore add 1 to the difference to
+			     account for that final year.  */
 			  match = (delta >= 0
 				   && delta < (((int64_t) era->stop_date[0]
 						- (int64_t) era->start_date[0])
-					       * era->absolute_direction));
+					       * era->absolute_direction
+					       + 1));
 			}
 		      if (! match)
 			return NULL;
@@ -928,10 +933,12 @@ __strptime_internal (const char *rp, const char *fmt, struct tm *tmp,
 			{
 			  int delta = ((tm->tm_year - era->offset)
 				       * era->absolute_direction);
+			  /* See comment above about year difference + 1.  */
 			  if (delta >= 0
 			      && delta < (((int64_t) era->stop_date[0]
 					   - (int64_t) era->start_date[0])
-					  * era->absolute_direction))
+					  * era->absolute_direction
+					  + 1))
 			    {
 			      s.decided = loc;
 			      break;