1 package parse; 2 3 import java.io.ByteArrayInputStream; 4 import java.io.IOException; 5 import javax.xml.parsers.DocumentBuilderFactory; 6 import javax.xml.parsers.ParserConfigurationException; 7 8 import static org.testng.Assert.assertEquals; 9 import org.testng.annotations.DataProvider; 10 import org.testng.annotations.Test; 11 import org.w3c.dom.Document; 12 import org.xml.sax.SAXException; 13 14 /** 15 * JDK-8059327: XML parser returns corrupt attribute value 16 * https://bugs.openjdk.java.net/browse/JDK-8059327 17 * 18 * Also: 19 * JDK-8061550: XMLEntityScanner can corrupt corrupt content during parsing 20 * https://bugs.openjdk.java.net/browse/JDK-8061550 21 * 22 * @Summary: verify that the character cache in XMLEntityScanner is reset properly 23 */ 24 25 public class XMLEntityScannerLoad { 26 27 @Test(dataProvider = "xmls") 28 public void test(String xml) throws SAXException, IOException, ParserConfigurationException { 29 Document d = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new ChunkInputStream(xml)); 30 String value = d.getDocumentElement().getAttribute("a1"); 31 assertEquals(value, "w"); 32 } 33 34 static class ChunkInputStream extends ByteArrayInputStream { 35 ChunkInputStream(String xml) { 36 super(xml.getBytes()); 37 } 38 39 @Override 40 public synchronized int read(byte[] b, int off, int len) { 41 return super.read(b, off, 7); 42 } 43 } 44 45 @DataProvider(name = "xmls") 46 private Object[][] xmls() { 47 return new Object[][] { 48 {"<?xml version=\"1.0\"?><element a1=\"w\" a2=\"""\"/>"}, 49 {"<?xml version=\"1.1\"?><element a1=\"w\" a2=\"""\"/>"} 50 }; 51 } 52 }