import java.io.ByteArrayInputStream; import java.io.IOException; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class UTF8ReaderBug { public static void main(String[] args) throws Throwable { StringBuilder b = new StringBuilder(""); for(int i = 5; i < 8223; i++) { b.append(' '); } // Add surrogate characters which overflow the buffer. This shows the need to place an // overflow check at ? // com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.read(UTF8Reader.java:544) b.append("\uD835\uDC37"); b.append(""); sendToParser(b.toString()); } private static void sendToParser(String b) throws Throwable { byte[] input = b.getBytes("UTF-8"); ByteArrayInputStream in = new ByteArrayInputStream(input); SAXParserFactory spf = SAXParserFactory.newInstance(); SAXParser p = spf.newSAXParser(); p.parse(new InputSource(in), new DefaultHandler()); } }