# HG changeset patch # User joehw # Date 1525374823 25200 # Node ID b7be5758a838958d381522629924d023c532254f # Parent e3653598e3b09aecd89530f15db8b41b5e811520 8201138: Defect in XMLEventReader.getElementText() may cause data to be skipped, duplicated or otherwise result in a ClassCastException Reviewed-by: lancea diff -r e3653598e3b0 -r b7be5758a838 src/java.xml/share/classes/com/sun/xml/internal/stream/XMLEventReaderImpl.java --- a/src/java.xml/share/classes/com/sun/xml/internal/stream/XMLEventReaderImpl.java Thu May 03 11:18:57 2018 -0700 +++ b/src/java.xml/share/classes/com/sun/xml/internal/stream/XMLEventReaderImpl.java Thu May 03 12:13:43 2018 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2018, 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 @@ -153,9 +153,9 @@ //space, cdata, characters and entity reference //nextEvent() would also set the last event. event = nextEvent(); - while(event.getEventType() != XMLEvent.END_ELEMENT){ - if( type == XMLEvent.CHARACTERS || type == XMLEvent.SPACE || - type == XMLEvent.CDATA){ + while ((type = event.getEventType()) != XMLEvent.END_ELEMENT) { + if (type == XMLEvent.CHARACTERS || type == XMLEvent.SPACE || + type == XMLEvent.CDATA){ data = event.asCharacters().getData(); } else if(type == XMLEvent.ENTITY_REFERENCE){ @@ -163,6 +163,7 @@ } else if(type == XMLEvent.COMMENT || type == XMLEvent.PROCESSING_INSTRUCTION){ //ignore + data = null; } else if(type == XMLEvent.END_DOCUMENT) { throw new XMLStreamException("unexpected end of document when reading element text content"); } else if(type == XMLEvent.START_ELEMENT) { diff -r e3653598e3b0 -r b7be5758a838 test/jaxp/javax/xml/jaxp/unittest/stream/XMLEventReaderTest/JDK8201138.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/jaxp/javax/xml/jaxp/unittest/stream/XMLEventReaderTest/JDK8201138.java Thu May 03 12:13:43 2018 -0700 @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2018, 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. + */ + +package stream.XMLEventReaderTest; + +import java.io.StringReader; +import javax.xml.stream.FactoryConfigurationError; +import javax.xml.stream.XMLEventReader; + +import javax.xml.stream.XMLInputFactory; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.events.Characters; +import javax.xml.stream.events.Comment; +import javax.xml.stream.events.StartDocument; +import javax.xml.stream.events.StartElement; + +import static org.testng.Assert.assertTrue; +import org.testng.annotations.Listeners; +import org.testng.annotations.Test; + +/* + * @test + * @bug 8201138 + * @library /javax/xml/jaxp/libs /javax/xml/jaxp/unittest + * @run testng/othervm -DrunSecMngr=true stream.XMLEventReaderTest.JDK8201138 + * @run testng/othervm stream.XMLEventReaderTest.JDK8201138 + * @summary Verifies a fix that set the type and data properly in the loop + */ +@Listeners({jaxp.library.BasePolicy.class}) +public class JDK8201138 { + + @Test + public void testTypeReset() throws XMLStreamException, FactoryConfigurationError { + + String xmlData = "aaaccc"; + + XMLEventReader eventReader = XMLInputFactory.newFactory().createXMLEventReader(new StringReader(xmlData)); + assertTrue(eventReader.nextEvent() instanceof StartDocument, "shall be StartDocument"); + assertTrue(eventReader.nextEvent() instanceof StartElement, "shall be StartElement"); + assertTrue(eventReader.peek() instanceof Comment, "shall be Comment"); + // the following returns empty string before the fix + assertTrue(eventReader.getElementText().equals("aaabbbccc"), "The text shall be \"aaabbbccc\""); + + eventReader.close(); + } + + @Test + public void testTypeResetAndBufferClear() throws XMLStreamException, FactoryConfigurationError { + + String xmlData = "aaa"; + + XMLEventReader eventReader = XMLInputFactory.newFactory().createXMLEventReader(new StringReader(xmlData)); + assertTrue(eventReader.nextEvent() instanceof StartDocument, "shall be StartDocument"); + assertTrue(eventReader.nextEvent() instanceof StartElement, "shall be StartElement"); + assertTrue(eventReader.peek() instanceof Characters, "shall be Characters"); + // the following throws ClassCastException before the fix + assertTrue(eventReader.getElementText().equals("aaa"), "The text shall be \"aaa\""); + + eventReader.close(); + } + +}