This is an automated email from the ASF dual-hosted git repository.

ggregory pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-io.git


The following commit(s) were added to refs/heads/master by this push:
     new 129eb40c XmlStreamReader can't parse XML an document with an external 
parsed entity prolog
129eb40c is described below

commit 129eb40c2a2b3fcfed1d73b313a1a79578b79341
Author: Gary Gregory <[email protected]>
AuthorDate: Tue Jan 2 11:25:10 2024 -0500

    XmlStreamReader can't parse XML an document with an external parsed
    entity prolog
---
 src/changes/changes.xml                                     |  3 ++-
 .../java/org/apache/commons/io/input/XmlStreamReader.java   |  2 +-
 .../org/apache/commons/io/input/XmlStreamReaderTest.java    | 13 ++++++++++++-
 3 files changed, 15 insertions(+), 3 deletions(-)

diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 7508b585..078be7b2 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -88,7 +88,8 @@ The <action> type attribute can be add,update,fix,remove.
       <action dev="ggregory" type="fix" issue="IO-807" due-to="Elliotte Rusty 
Harold, Gary Gregory">Characterization test for broken symlinks when copying 
directories #547.</action>
       <action dev="ggregory" type="fix" due-to="Gary 
Gregory">ClosedInputStream.read(byte[], int, int) does not always return 
-1.</action>
       <action dev="ggregory" type="fix" due-to="Gary 
Gregory">ClosedOutputStream.write(byte[], int, int) does not always throw 
IOException.</action>
-      <action dev="ggregory" type="fix" due-to="Sylwester Lachiewicz, Gary 
Gregory">XmlStreamReader can't parse XML document with multi-line prolog 
#550.</action>
+      <action dev="ggregory" type="fix" due-to="Sylwester Lachiewicz, Gary 
Gregory">XmlStreamReader can't parse an XML document with a multi-line prolog 
#550.</action>
+      <action dev="ggregory" type="fix" due-to="Andreas Hubold, Gary 
Gregory">XmlStreamReader can't parse XML an document with an external parsed 
entity prolog.</action>
       <!-- Add -->
       <action dev="ggregory" type="add"                due-to="Gary 
Gregory">Add and use PathUtils.getFileName(Path, Function&lt;Path, 
R&gt;).</action>
       <action dev="ggregory" type="add"                due-to="Gary 
Gregory">Add and use PathUtils.getFileNameString().</action>
diff --git a/src/main/java/org/apache/commons/io/input/XmlStreamReader.java 
b/src/main/java/org/apache/commons/io/input/XmlStreamReader.java
index 21ce82db..37d1596e 100644
--- a/src/main/java/org/apache/commons/io/input/XmlStreamReader.java
+++ b/src/main/java/org/apache/commons/io/input/XmlStreamReader.java
@@ -228,7 +228,7 @@ public class XmlStreamReader extends Reader {
     public static final Pattern ENCODING_PATTERN = Pattern.compile(
     // @formatter:off
             "^<\\?xml\\s+"
-            + "version\\s*=\\s*(?:(?:\"1\\.[0-9]+\")|(?:'1.[0-9]+'))\\s+"
+            + "(?:version\\s*=\\s*(?:(?:\"1\\.[0-9]+\")|(?:'1.[0-9]+'))\\s+)??"
             + "encoding\\s*=\\s*"
             + "((?:\"[A-Za-z0-9][A-Za-z0-9._+:-]*\")"  // double-quoted
             +  "|(?:'[A-Za-z0-9][A-Za-z0-9._+:-]*'))", // single-quoted
diff --git a/src/test/java/org/apache/commons/io/input/XmlStreamReaderTest.java 
b/src/test/java/org/apache/commons/io/input/XmlStreamReaderTest.java
index 46379abb..4260a1aa 100644
--- a/src/test/java/org/apache/commons/io/input/XmlStreamReaderTest.java
+++ b/src/test/java/org/apache/commons/io/input/XmlStreamReaderTest.java
@@ -64,6 +64,7 @@ public class XmlStreamReaderTest {
     private static final String UTF_32BE = "UTF-32BE";
     private static final String UTF_8 = StandardCharsets.UTF_8.name();
 
+    private static final String XML7 = "xml-prolog-encoding-no-version";
     private static final String XML6 = "xml-prolog-encoding-new-line";
     private static final String XML5 = 
"xml-prolog-encoding-spaced-single-quotes";
     private static final String XML4 = "xml-prolog-encoding-single-quotes";
@@ -107,9 +108,13 @@ public class XmlStreamReaderTest {
 
     private static final MessageFormat XML_WITH_PROLOG = new MessageFormat(
             "<?xml version=\"1.0\"?>\n<root>{2}</root>");
+
     private static final MessageFormat XML_WITH_PROLOG_AND_ENCODING_NEW_LINES 
= new MessageFormat(
             
"<?xml\nversion\n=\n\"1.0\"\nencoding\n=\n\"{1}\"\n?>\n<root>{2}</root>");
 
+    private static final MessageFormat XML_EXTERNAL_PARSED_ENTITY_NO_VERSION = 
new MessageFormat(
+            "<?xml\nencoding\n=\n\"{1}\"\n?>\n<root>{2}</root>");
+
     private static final MessageFormat 
XML_WITH_PROLOG_AND_ENCODING_DOUBLE_QUOTES = new MessageFormat(
             "<?xml version=\"1.0\" encoding=\"{1}\"?>\n<root>{2}</root>");
 
@@ -131,6 +136,7 @@ public class XmlStreamReaderTest {
         XMLs.put(XML4, XML_WITH_PROLOG_AND_ENCODING_SINGLE_QUOTES);
         XMLs.put(XML5, XML_WITH_PROLOG_AND_ENCODING_SPACED_SINGLE_QUOTES);
         XMLs.put(XML6, XML_WITH_PROLOG_AND_ENCODING_NEW_LINES);
+        XMLs.put(XML7, XML_EXTERNAL_PARSED_ENTITY_NO_VERSION);
     }
 
     /**
@@ -637,5 +643,10 @@ public class XmlStreamReaderTest {
         xmlReader = new XmlStreamReader(is);
         assertEquals(xmlReader.getEncoding(), encoding);
         xmlReader.close();
-    }
+
+        is = getXmlInputStream("no-bom", XML7, encoding, encoding);
+        xmlReader = new XmlStreamReader(is);
+        assertEquals(xmlReader.getEncoding(), encoding);
+        xmlReader.close();
+}
 }

Reply via email to