]> granicus.if.org Git - php/commitdiff
Fix #30875: xml_parse_into_struct() does not resolve entities
authorChristoph M. Becker <cmbecker69@gmx.de>
Tue, 9 Oct 2018 14:04:43 +0000 (16:04 +0200)
committerChristoph M. Becker <cmbecker69@gmx.de>
Tue, 9 Oct 2018 14:04:43 +0000 (16:04 +0200)
Setting up an empty default handler is not only useless, but actually
harmful, since internal entity-references are not resolved anymore.
From the libexpat docs[1]:

| Setting the handler with this call has the side effect of
| turning off expansion of references to internally defined general
| entities. Instead these references are passed to the default
| handler.

[1] <https://www.xml.com/pub/1999/09/expat/reference.html#setdefhandler>

NEWS
ext/xml/tests/bug30875.phpt [new file with mode: 0644]
ext/xml/xml.c

diff --git a/NEWS b/NEWS
index bd8d30afeb6cd411a292207b29f335015a39c8db..97230332b4aa84cfac0ad5de5ab07b0da9df3635 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -26,6 +26,9 @@ PHP                                                                        NEWS
   . Fixed bug #76965 (INI_SCANNER_RAW doesn't strip trailing whitespace).
     (Pierrick)
 
+- XML:
+  . Fixed bug #30875 (xml_parse_into_struct() does not resolve entities). (cmb)
+
 11 Oct 2018, PHP 7.1.23
 
 - Core:
diff --git a/ext/xml/tests/bug30875.phpt b/ext/xml/tests/bug30875.phpt
new file mode 100644 (file)
index 0000000..c5254e9
--- /dev/null
@@ -0,0 +1,42 @@
+--TEST--
+Bug #30875 (xml_parse_into_struct() does not resolve entities)
+--SKIPIF--
+<?php
+if (!extension_loaded('xml')) die('skip xml extension not available');
+?>
+--FILE--
+<?php
+
+$xml = <<<XML
+<!DOCTYPE dtd [
+    <!ENTITY ref "ent">
+]>
+<elt att="&ref;">a&ref;</elt>
+XML;
+
+$parser = xml_parser_create();
+xml_parse_into_struct($parser, $xml, $vals);
+xml_parser_free($parser);
+var_dump($vals);
+?>
+===DONE===
+--EXPECT--
+array(1) {
+  [0]=>
+  array(5) {
+    ["tag"]=>
+    string(3) "ELT"
+    ["type"]=>
+    string(8) "complete"
+    ["level"]=>
+    int(1)
+    ["attributes"]=>
+    array(1) {
+      ["ATT"]=>
+      string(3) "ent"
+    }
+    ["value"]=>
+    string(4) "aent"
+  }
+}
+===DONE===
index 09a773820554ecfb9bd12ae30d300334256d9d77..494c3472013182c628d176eab32a444c1b5aecf2 100644 (file)
@@ -1447,7 +1447,6 @@ PHP_FUNCTION(xml_parse_into_struct)
        parser->level = 0;
        parser->ltags = safe_emalloc(XML_MAXLEVEL, sizeof(char *), 0);
 
-       XML_SetDefaultHandler(parser->parser, _xml_defaultHandler);
        XML_SetElementHandler(parser->parser, _xml_startElementHandler, _xml_endElementHandler);
        XML_SetCharacterDataHandler(parser->parser, _xml_characterDataHandler);