diff --git a/ext/xml/compat.c b/ext/xml/compat.c index be988a822f179..fc4525650fc23 100644 --- a/ext/xml/compat.c +++ b/ext/xml/compat.c @@ -565,16 +565,8 @@ XML_Parse(XML_Parser parser, const XML_Char *data, int data_len, int is_final) { int error; - if (parser->parser->lastError.level >= XML_ERR_WARNING) { - return 0; - } - error = xmlParseChunk(parser->parser, (char *) data, data_len, is_final); - if (error) { - return 0; - } else { - return 1; - } + return !error && parser->parser->lastError.level <= XML_ERR_WARNING; } PHP_XML_API int diff --git a/ext/xml/tests/bug73135.phpt b/ext/xml/tests/bug73135.phpt index ede7b7acf0ca7..ef1ca6c75989d 100644 --- a/ext/xml/tests/bug73135.phpt +++ b/ext/xml/tests/bug73135.phpt @@ -21,6 +21,10 @@ HERE; xml_parse($parser, $xml); ?> --EXPECTF-- +Warning: xml_parse(): Parser must not be called recursively in %s%ebug73135.php on line %d + +Warning: xml_parse(): Parser must not be called recursively in %s%ebug73135.php on line %d + Warning: xml_parse(): Unable to call handler ahihi() in %s%ebug73135.php on line %d Warning: xml_parse(): Unable to call handler ahihi() in %s%ebug73135.php on line %d diff --git a/ext/xml/tests/bug81351.phpt b/ext/xml/tests/bug81351.phpt new file mode 100644 index 0000000000000..19e4ca590b90d --- /dev/null +++ b/ext/xml/tests/bug81351.phpt @@ -0,0 +1,28 @@ +--TEST-- +Bug #81351 (xml_parse may fail, but has no error code) +--SKIPIF-- + +--FILE-- + + + + +XML; + +$parser = xml_parser_create_ns('UTF-8'); +$success = xml_parse($parser, $xml, false); +$code = xml_get_error_code($parser); +$error = xml_error_string($code); +echo "xml_parse returned $success, xml_get_error_code = $code, xml_error_string = $error\r\n"; +$success = xml_parse($parser, 'Y>', true); +$code = xml_get_error_code($parser); +$error = xml_error_string($code); +echo "xml_parse returned $success, xml_get_error_code = $code, xml_error_string = $error\r\n"; +?> +--EXPECT-- +xml_parse returned 1, xml_get_error_code = 0, xml_error_string = No error +xml_parse returned 0, xml_get_error_code = 5, xml_error_string = Invalid document end diff --git a/ext/xml/xml.c b/ext/xml/xml.c index af3431daa438c..fd8aebe03a524 100644 --- a/ext/xml/xml.c +++ b/ext/xml/xml.c @@ -1416,6 +1416,10 @@ PHP_FUNCTION(xml_parse) RETURN_FALSE; } + if (parser->isparsing) { + php_error_docref(NULL, E_WARNING, "Parser must not be called recursively"); + RETURN_FALSE; + } parser->isparsing = 1; ret = XML_Parse(parser->parser, (XML_Char*)data, data_len, isFinal); parser->isparsing = 0; @@ -1467,6 +1471,10 @@ PHP_FUNCTION(xml_parse_into_struct) XML_SetElementHandler(parser->parser, _xml_startElementHandler, _xml_endElementHandler); XML_SetCharacterDataHandler(parser->parser, _xml_characterDataHandler); + if (parser->isparsing) { + php_error_docref(NULL, E_WARNING, "Parser must not be called recursively"); + RETURN_FALSE; + } parser->isparsing = 1; ret = XML_Parse(parser->parser, (XML_Char*)data, data_len, 1); parser->isparsing = 0;