From c3026d4a59f1bc0b651bca61faed18b05cbc5f68 Mon Sep 17 00:00:00 2001 From: Yuka Kamiya Date: Wed, 3 Oct 2012 15:11:28 +0900 Subject: [PATCH] 7104012: AIOOBE from RuleBasedBreakIterator.lookupState for some suppl. chars Reviewed-by: okutsu --- .../sun/text/SupplementaryCharacterData.java | 10 ++- .../java/text/BreakIterator/Bug7104012.java | 78 +++++++++++++++++++ 2 files changed, 86 insertions(+), 2 deletions(-) create mode 100644 jdk/test/java/text/BreakIterator/Bug7104012.java diff --git a/jdk/src/share/classes/sun/text/SupplementaryCharacterData.java b/jdk/src/share/classes/sun/text/SupplementaryCharacterData.java index d1e3b40986e..91c1bea9a57 100644 --- a/jdk/src/share/classes/sun/text/SupplementaryCharacterData.java +++ b/jdk/src/share/classes/sun/text/SupplementaryCharacterData.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, 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 @@ -31,6 +31,11 @@ package sun.text; */ public final class SupplementaryCharacterData implements Cloneable { + /** + * A token used as a character-category value to identify ignore characters + */ + private static final byte IGNORE = -1; + /** * An array for supplementary characters and values. * Lower one byte is used to keep a byte-value. @@ -78,7 +83,8 @@ public final class SupplementaryCharacterData implements Cloneable { } else if (index > (end-1)) { i = k; } else { - return dataTable[k] & 0xFF; + int v = dataTable[k] & 0xFF; + return (v == 0xFF) ? IGNORE : v; } } } diff --git a/jdk/test/java/text/BreakIterator/Bug7104012.java b/jdk/test/java/text/BreakIterator/Bug7104012.java new file mode 100644 index 00000000000..ced84b9edb7 --- /dev/null +++ b/jdk/test/java/text/BreakIterator/Bug7104012.java @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2012, 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +/* + * @test + * @bug 7104012 + * @summary Confirm that AIOBE is not thrown. + */ + +import java.text.*; +import java.util.*; + +public class Bug7104012 { + + public static void main(String[] args) { + boolean err = false; + + List data = new ArrayList<>(); + data.add("\udb40"); + data.add(" \udb40"); + data.add("\udc53"); + data.add(" \udc53"); + data.add(" \udb40\udc53"); + data.add("\udb40\udc53"); + data.add("ABC \udb40\udc53 123"); + data.add("\udb40\udc53 ABC \udb40\udc53"); + + for (Locale locale : Locale.getAvailableLocales()) { + List breakIterators = new ArrayList<>(); + breakIterators.add(BreakIterator.getCharacterInstance(locale)); + breakIterators.add(BreakIterator.getLineInstance(locale)); + breakIterators.add(BreakIterator.getSentenceInstance(locale)); + breakIterators.add(BreakIterator.getWordInstance(locale)); + + for (BreakIterator bi : breakIterators) { + for (String str : data) { + try { + bi.setText(str); + bi.first(); + while (bi.next() != BreakIterator.DONE) { } + bi.last(); + while (bi.previous() != BreakIterator.DONE) { } + } + catch (ArrayIndexOutOfBoundsException ex) { + System.out.println(" " + data.indexOf(str) + + ": BreakIterator(" + locale + + ") threw AIOBE."); + err = true; + } + } + } + } + + if (err) { + throw new RuntimeException("Unexpected exeption."); + } + } + +}