From bea4109ef75a6536af4296db56e6ec90ab0f30fc Mon Sep 17 00:00:00 2001 From: Naoto Sato Date: Thu, 27 May 2021 13:18:34 +0000 Subject: [PATCH] 8187649: ArrayIndexOutOfBoundsException in java.util.JapaneseImperialCalendar Reviewed-by: joehw, rriggs --- .../java/util/JapaneseImperialCalendar.java | 8 ++-- .../CalendarTestScripts/JapaneseTests.java | 4 +- .../japanese/japanese_roll.cts | 44 +++++++++++++++++-- 3 files changed, 46 insertions(+), 10 deletions(-) diff --git a/src/java.base/share/classes/java/util/JapaneseImperialCalendar.java b/src/java.base/share/classes/java/util/JapaneseImperialCalendar.java index bd1cb51c660..19374b2e43f 100644 --- a/src/java.base/share/classes/java/util/JapaneseImperialCalendar.java +++ b/src/java.base/share/classes/java/util/JapaneseImperialCalendar.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2019, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -886,7 +886,7 @@ class JapaneseImperialCalendar extends Calendar { } else if (nfd >= (month1 + monthLength)) { nfd = month1 + monthLength - 1; } - set(DAY_OF_MONTH, (int)(nfd - month1) + 1); + set(DAY_OF_MONTH, getCalendarDate(nfd).getDayOfMonth()); return; } @@ -1458,7 +1458,7 @@ class JapaneseImperialCalendar extends Calendar { CalendarDate d = gcal.newCalendarDate(TimeZone.NO_TIMEZONE); d.setDate(date.getNormalizedYear(), date.getMonth(), 1); int dayOfWeek = gcal.getDayOfWeek(d); - int monthLength = gcal.getMonthLength(d); + int monthLength = actualMonthLength(); dayOfWeek -= getFirstDayOfWeek(); if (dayOfWeek < 0) { dayOfWeek += 7; @@ -2239,7 +2239,7 @@ class JapaneseImperialCalendar extends Calendar { private int actualMonthLength() { int length = jcal.getMonthLength(jdate); int eraIndex = getTransitionEraIndex(jdate); - if (eraIndex == -1) { + if (eraIndex != -1) { long transitionFixedDate = sinceFixedDates[eraIndex]; CalendarDate d = eras[eraIndex].getSinceDate(); if (transitionFixedDate <= cachedFixedDate) { diff --git a/test/jdk/java/util/Calendar/CalendarTestScripts/JapaneseTests.java b/test/jdk/java/util/Calendar/CalendarTestScripts/JapaneseTests.java index e1b006fb9e4..403e483affa 100644 --- a/test/jdk/java/util/Calendar/CalendarTestScripts/JapaneseTests.java +++ b/test/jdk/java/util/Calendar/CalendarTestScripts/JapaneseTests.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -24,7 +24,7 @@ /* * @test * @summary tests Japanese Calendar. - * @bug 4609228 + * @bug 4609228 8187649 * @modules java.base/sun.util * java.base/sun.util.calendar * @compile diff --git a/test/jdk/java/util/Calendar/CalendarTestScripts/japanese/japanese_roll.cts b/test/jdk/java/util/Calendar/CalendarTestScripts/japanese/japanese_roll.cts index daa2bd4d8fa..eddf440b305 100644 --- a/test/jdk/java/util/Calendar/CalendarTestScripts/japanese/japanese_roll.cts +++ b/test/jdk/java/util/Calendar/CalendarTestScripts/japanese/japanese_roll.cts @@ -435,12 +435,48 @@ test roll WEEK_OF_YEAR check date BeforeMeiji $minyear Dec 25 test WEEK_OF_MONTH - # Needs to wait for 6191841 fix. (WEEK_OF_MONTH needs to change - # ERA and YEAR in a transition month.) + use jcal + clear all + + # Make sure this test does not throw AIOOBE + set date Heisei 1 Aug 1 + roll week_of_month 1 + check date Heisei 1 Aug 8 + + # Check transition dates + set date Showa 64 Jan 7 + roll week_of_month 1 + check date Showa 64 Jan 7 + roll week_of_month -1 + check date Showa 64 Jan 7 + + set date Heisei 1 Jan 31 + roll week_of_month 1 + check date Heisei 1 Jan 10 + roll week_of_month -1 + check date Heisei 1 Jan 31 test DAY_OF_MONTH - # Needs to wait for 6191841 fix. (DAY_OF_MONTH needs to change - # ERA and YEAR in a transition month.) + use jcal + clear all + + # Make sure this test does not throw AIOOBE + Set date Heisei 1 Aug 1 + roll day_of_month 1 + check date Heisei 1 Aug 2 + + # Check transition dates + set date Showa 64 Jan 7 + roll day_of_month 1 + check date Showa 64 Jan 1 + roll day_of_month -1 + check date Showa 64 Jan 7 + + set date Heisei 1 Jan 31 + roll day_of_month 1 + check date Heisei 1 Jan 8 + roll day_of_month -1 + check date Heisei 1 Jan 31 test DAY_OF_YEAR use jcal