From d0668c07b4513e19bf01e676e6f06056997b81ac Mon Sep 17 00:00:00 2001 From: Semyon Sadetsky <ssadetsky@openjdk.org> Date: Tue, 7 Jun 2016 11:57:59 +0300 Subject: [PATCH] 8151015: JTextArea.insert() does not behave as expected with invalid position Reviewed-by: prr --- .../javax/swing/text/AbstractDocument.java | 5 +- .../DocumentInsertAtWrongPositionTest.java | 61 +++++++++++++++++++ .../text/GapContent/4496801/bug4496801.java | 53 ++++++++++++++++ 3 files changed, 118 insertions(+), 1 deletion(-) create mode 100644 jdk/test/javax/swing/text/AbstractDocument/DocumentInsert/DocumentInsertAtWrongPositionTest.java create mode 100644 jdk/test/javax/swing/text/GapContent/4496801/bug4496801.java diff --git a/jdk/src/java.desktop/share/classes/javax/swing/text/AbstractDocument.java b/jdk/src/java.desktop/share/classes/javax/swing/text/AbstractDocument.java index 815aee02244..5514ecb4f6a 100644 --- a/jdk/src/java.desktop/share/classes/javax/swing/text/AbstractDocument.java +++ b/jdk/src/java.desktop/share/classes/javax/swing/text/AbstractDocument.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2016, 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 @@ -702,6 +702,9 @@ public abstract class AbstractDocument implements Document, Serializable { if ((str == null) || (str.length() == 0)) { return; } + if (offs > getLength()) { + throw new BadLocationException("Invalid insert", getLength()); + } DocumentFilter filter = getDocumentFilter(); writeLock(); diff --git a/jdk/test/javax/swing/text/AbstractDocument/DocumentInsert/DocumentInsertAtWrongPositionTest.java b/jdk/test/javax/swing/text/AbstractDocument/DocumentInsert/DocumentInsertAtWrongPositionTest.java new file mode 100644 index 00000000000..a6da38699c6 --- /dev/null +++ b/jdk/test/javax/swing/text/AbstractDocument/DocumentInsert/DocumentInsertAtWrongPositionTest.java @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2016, 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. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * 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. + */ + +import javax.swing.*; +import javax.swing.text.*; + +/* + * @test + * @bug 8151015 + * @summary JTextArea.insert() does not behave as expected with invalid position + * @run main DocumentInsertAtWrongPositionTest + */ +public class DocumentInsertAtWrongPositionTest { + public static void main(String[] args) throws Exception { + JTextField te = new JTextField("1234567890"); + JTextPane tp = new JTextPane(); + tp.setText("1234567890"); + JTextArea ta = new JTextArea("1234567890"); + + try { + ta.insert("abc", 11); + + throw new RuntimeException("failed"); + } catch (IllegalArgumentException e) { + } + try { + + te.getDocument().insertString(11, "abc", new SimpleAttributeSet()); + + throw new RuntimeException("failed"); + } catch (BadLocationException e) { + } + try { + tp.getDocument().insertString(11, "abc", new SimpleAttributeSet()); + throw new RuntimeException("failed"); + } catch (BadLocationException e) { + } + } +} diff --git a/jdk/test/javax/swing/text/GapContent/4496801/bug4496801.java b/jdk/test/javax/swing/text/GapContent/4496801/bug4496801.java new file mode 100644 index 00000000000..aa258a8dc86 --- /dev/null +++ b/jdk/test/javax/swing/text/GapContent/4496801/bug4496801.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2016, 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. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * 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 4496801 8151015 + @summary Tests HTMLDocument.insertBeforeEnd() method + @author Peter Zhelezniakov + @run main bug4496801 +*/ + +import javax.swing.text.html.parser.ParserDelegator; +import javax.swing.text.html.*; +import javax.swing.text.*; +import java.io.IOException; + +public class bug4496801 { + public static void main(String[] args) { + HTMLDocument doc = new HTMLDocument(); + doc.setParser(new ParserDelegator()); + + Element html = doc.getRootElements()[0]; + Element body = html.getElement(0); + + try { + doc.insertBeforeEnd(body, "<h2>foo</h2>"); + } catch (IOException e) { + } catch (BadLocationException e) { + throw new RuntimeException("Insertion failed"); + } + } +}