Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 43 additions & 0 deletions ext/xml/tests/xml_set_handler_reentrancy.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
--TEST--
GH-23818 (Changing XML handlers while parsing is rejected)
--EXTENSIONS--
xml
--FILE--
<?php

$startHandler = static function (XMLParser $parser): void {
$replacement = static function () {};

try {
xml_set_element_handler($parser, $replacement, $replacement);
} catch (Error $error) {
echo 'xml_set_element_handler: ', $error->getMessage(), "\n";
}

try {
xml_set_character_data_handler($parser, $replacement);
} catch (Error $error) {
echo 'xml_set_character_data_handler: ', $error->getMessage(), "\n";
}
};

$parser = xml_parser_create();
xml_set_element_handler($parser, $startHandler, static function () {
echo "end\n";
});
xml_set_character_data_handler($parser, static function (XMLParser $parser, string $data) {
echo $data, "\n";
});

var_dump(xml_parse($parser, '<root>text</root>', true));
var_dump(xml_set_element_handler($parser, null, null));
var_dump(xml_set_character_data_handler($parser, null));
?>
--EXPECT--
xml_set_element_handler: Cannot change handlers while parsing
xml_set_character_data_handler: Cannot change handlers while parsing
text
end
int(1)
bool(true)
bool(true)
11 changes: 11 additions & 0 deletions ext/xml/xml.c
Original file line number Diff line number Diff line change
Expand Up @@ -1308,6 +1308,12 @@ PHP_FUNCTION(xml_set_element_handler)
}

set_handlers:
if (parser->isparsing) {
zend_release_fcall_info_cache(&start_fcc);
zend_release_fcall_info_cache(&end_fcc);
zend_throw_error(NULL, "Cannot change handlers while parsing");
RETURN_THROWS();
}
xml_set_handler(&parser->startElementHandler, &start_fcc);
xml_set_handler(&parser->endElementHandler, &end_fcc);
XML_SetElementHandler(parser->parser, xml_startElementHandler, xml_endElementHandler);
Expand Down Expand Up @@ -1361,6 +1367,11 @@ static void php_xml_set_handler_parse_callable(
php_xml_set_handler_parse_callable(INTERNAL_FUNCTION_PARAM_PASSTHRU, &parser, &handler_fcc); \
if (EG(exception)) { return; } \
ZEND_ASSERT(parser); \
if (parser->isparsing) { \
zend_release_fcall_info_cache(&handler_fcc); \
zend_throw_error(NULL, "Cannot change handlers while parsing"); \
RETURN_THROWS(); \
} \
xml_set_handler(&parser->parser_handler_name, &handler_fcc); \
parse_function(parser->parser, c_function); \
RETURN_TRUE; \
Expand Down
Loading