Fix arginfo/ZPP mismatch for simplexml_import_dom

Closes GH-6905
This commit is contained in:
Máté Kocsis 2021-04-23 18:40:54 +02:00
parent 23a192d12d
commit cb84e5c332
No known key found for this signature in database
GPG key ID: FD055E41728BF310
3 changed files with 19 additions and 14 deletions

View file

@ -2619,27 +2619,32 @@ PHP_FUNCTION(simplexml_import_dom)
RETURN_THROWS(); RETURN_THROWS();
} }
object = Z_LIBXML_NODE_P(node);
nodep = php_libxml_import_node(node); nodep = php_libxml_import_node(node);
if (nodep) { if (!nodep) {
if (nodep->doc == NULL) { zend_argument_type_error(1, "must be of type SimpleXMLElement|DOMNode, %s given", zend_zval_type_name(node));
php_error_docref(NULL, E_WARNING, "Imported Node must have associated Document"); RETURN_THROWS();
RETURN_NULL();
}
if (nodep->type == XML_DOCUMENT_NODE || nodep->type == XML_HTML_DOCUMENT_NODE) {
nodep = xmlDocGetRootElement((xmlDocPtr) nodep);
}
} }
if (nodep && nodep->type == XML_ELEMENT_NODE) { if (nodep->doc == NULL) {
php_error_docref(NULL, E_WARNING, "Imported Node must have associated Document");
RETURN_NULL();
}
if (nodep->type == XML_DOCUMENT_NODE || nodep->type == XML_HTML_DOCUMENT_NODE) {
nodep = xmlDocGetRootElement((xmlDocPtr) nodep);
}
if (nodep->type == XML_ELEMENT_NODE) {
if (!ce) { if (!ce) {
ce = sxe_class_entry; ce = sxe_class_entry;
fptr_count = NULL; fptr_count = NULL;
} else { } else {
fptr_count = php_sxe_find_fptr_count(ce); fptr_count = php_sxe_find_fptr_count(ce);
} }
object = Z_LIBXML_NODE_P(node);
sxe = php_sxe_object_new(ce, fptr_count); sxe = php_sxe_object_new(ce, fptr_count);
sxe->document = object->document; sxe->document = object->document;
php_libxml_increment_doc_ref((php_libxml_node_object *)sxe, nodep->doc); php_libxml_increment_doc_ref((php_libxml_node_object *)sxe, nodep->doc);

View file

@ -6,7 +6,7 @@ function simplexml_load_file(string $filename, ?string $class_name = SimpleXMLEl
function simplexml_load_string(string $data, ?string $class_name = SimpleXMLElement::class, int $options = 0, string $namespace_or_prefix = "", bool $is_prefix = false): SimpleXMLElement|false {} function simplexml_load_string(string $data, ?string $class_name = SimpleXMLElement::class, int $options = 0, string $namespace_or_prefix = "", bool $is_prefix = false): SimpleXMLElement|false {}
function simplexml_import_dom(DOMNode $node, ?string $class_name = SimpleXMLElement::class): ?SimpleXMLElement {} function simplexml_import_dom(SimpleXMLElement|DOMNode $node, ?string $class_name = SimpleXMLElement::class): ?SimpleXMLElement {}
class SimpleXMLElement implements Stringable, Countable, RecursiveIterator class SimpleXMLElement implements Stringable, Countable, RecursiveIterator
{ {

View file

@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead. /* This is a generated file, edit the .stub.php file instead.
* Stub hash: f8ca25a00ae1a5fed436851e88229b503c77bf31 */ * Stub hash: 70ace711365bb5e7df3174d4cfe68fb3df34a105 */
ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_simplexml_load_file, 0, 1, SimpleXMLElement, MAY_BE_FALSE) ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_simplexml_load_file, 0, 1, SimpleXMLElement, MAY_BE_FALSE)
ZEND_ARG_TYPE_INFO(0, filename, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, filename, IS_STRING, 0)
@ -18,7 +18,7 @@ ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_simplexml_load_string, 0, 1,
ZEND_END_ARG_INFO() ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_simplexml_import_dom, 0, 1, SimpleXMLElement, 1) ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_simplexml_import_dom, 0, 1, SimpleXMLElement, 1)
ZEND_ARG_OBJ_INFO(0, node, DOMNode, 0) ZEND_ARG_OBJ_TYPE_MASK(0, node, SimpleXMLElement|DOMNode, 0, NULL)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, class_name, IS_STRING, 1, "SimpleXMLElement::class") ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, class_name, IS_STRING, 1, "SimpleXMLElement::class")
ZEND_END_ARG_INFO() ZEND_END_ARG_INFO()