Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-6511588

XMLFormatter does not handle non-XML-safe characters

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Duplicate
    • Icon: P3 P3
    • None
    • 7
    • core-libs

      Run:

      ---%<---
      import java.io.ByteArrayInputStream;
      import java.util.logging.Level;
      import org.xml.sax.helpers.DefaultHandler;
      import java.util.logging.LogRecord;
      import java.util.logging.XMLFormatter;
      import javax.xml.parsers.SAXParserFactory;
      public class XMLFormatterBug {
          public static void main(String[] args) throws Exception {
              LogRecord rec = new LogRecord(Level.INFO, "This is a bug\b\b\bdefect.");
              String xmltext = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
                      new XMLFormatter().format(rec);
              System.out.print(xmltext);
              SAXParserFactory.newInstance().newSAXParser().parse(
                      new ByteArrayInputStream(xmltext.getBytes("UTF-8")),
                      new DefaultHandler());
          }
      }
      ---%<---

      I get ("^H" means the actual control char):

      ---%<---
      java version "1.7.0-ea"
      Java(TM) SE Runtime Environment (build 1.7.0-ea-b05)
      Java HotSpot(TM) Client VM (build 1.7.0-ea-b05, mixed mode, sharing)

      <?xml version="1.0" encoding="UTF-8"?>
      <record>
        <date>2007-01-10T08:42:01</date>
        <millis>1168436521500</millis>
        <sequence>0</sequence>
        <level>INFO</level>
        <thread>10</thread>
        <message>This is a bug^H^H^Hdefect.</message>
      </record>
      Exception in thread "main" org.xml.sax.SAXParseException: An invalid XML character (Unicode: 0x8) was found in the element content of the document.
              at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:195)
              at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(ErrorHandlerWrapper.java:174)
              at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:388)
              at com.sun.org.apache.xerces.internal.impl.XMLScanner.reportFatalError(XMLScanner.java:1411)
              at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2879)
              at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:645)
              at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:508)
              at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:807)
              at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737)
              at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:107)
              at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1205)
              at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:522)
              at javax.xml.parsers.SAXParser.parse(SAXParser.java:395)
              at javax.xml.parsers.SAXParser.parse(SAXParser.java:198)
              at XMLFormatterBug.main(XMLFormatterBug.java:13)
      ---%<---

      The reason is that java.util.logging.XMLFormatter.escape(StringBuffer,String) does not take into account the possibility of non-XML-safe characters as defined in the XML spec.

            Unassigned Unassigned
            jglick Jesse Glick (Inactive)
            Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

              Created:
              Updated:
              Resolved:
              Imported:
              Indexed: