summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ext/xml/compat.c5
-rw-r--r--ext/xml/tests/bug71592.phpt30
2 files changed, 34 insertions, 1 deletions
diff --git a/ext/xml/compat.c b/ext/xml/compat.c
index 012e6b134b..e5db4469dc 100644
--- a/ext/xml/compat.c
+++ b/ext/xml/compat.c
@@ -359,7 +359,10 @@ _external_entity_ref_handler(void *user, const xmlChar *names, int type, const x
return;
}
- parser->h_external_entity_ref(parser, names, (XML_Char *) "", sys_id, pub_id);
+ if (!parser->h_external_entity_ref(parser, names, (XML_Char *) "", sys_id, pub_id)) {
+ xmlStopParser(parser->parser);
+ parser->parser->errNo = XML_ERROR_EXTERNAL_ENTITY_HANDLING;
+ };
}
static xmlEntityPtr
diff --git a/ext/xml/tests/bug71592.phpt b/ext/xml/tests/bug71592.phpt
new file mode 100644
index 0000000000..28a316a28e
--- /dev/null
+++ b/ext/xml/tests/bug71592.phpt
@@ -0,0 +1,30 @@
+--TEST--
+Bug #71592 (External entity processing never fails)
+--SKIPIF--
+<?php
+if (!extension_loaded('xml')) die('skip xml extension not available');
+?>
+--FILE--
+<?php
+$xml = <<<XML
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE p [
+ <!ENTITY pic PUBLIC "image.gif" "http://example.org/image.gif">
+]>
+<root>
+<p>&pic;</p>
+<p></nop>
+</root>
+XML;
+
+$parser = xml_parser_create_ns('UTF-8');
+xml_set_external_entity_ref_handler($parser, function () {
+ return false;
+});
+xml_parse($parser, $xml);
+var_dump(xml_get_error_code($parser));
+?>
+===DONE===
+--EXPECT--
+int(21)
+===DONE===