1
0
mirror of https://github.com/php/php-src.git synced 2026-03-24 00:02:20 +01:00

Merge branch 'PHP-8.5'

* PHP-8.5:
  Fix GH-21097: Accessing Dom\Node properties can can throw TypeError(s)
This commit is contained in:
Niels Dossche
2026-02-03 18:41:13 +01:00
6 changed files with 75 additions and 5 deletions

View File

@@ -53,7 +53,7 @@ zend_result dom_documenttype_entities_read(dom_object *obj, zval *retval)
{
DOM_PROP_NODE(xmlDtdPtr, dtdptr, obj);
object_init_ex(retval, dom_get_dtd_namednodemap_ce(php_dom_follow_spec_intern(obj)));
object_init_ex(retval, dom_get_dtd_namednodemap_ce(instanceof_function(obj->std.ce, dom_modern_documenttype_class_entry)));
xmlHashTable *entityht = (xmlHashTable *) dtdptr->entities;
@@ -74,7 +74,7 @@ zend_result dom_documenttype_notations_read(dom_object *obj, zval *retval)
{
DOM_PROP_NODE(xmlDtdPtr, dtdptr, obj);
object_init_ex(retval, dom_get_dtd_namednodemap_ce(php_dom_follow_spec_intern(obj)));
object_init_ex(retval, dom_get_dtd_namednodemap_ce(instanceof_function(obj->std.ce, dom_modern_documenttype_class_entry)));
xmlHashTable *notationht = (xmlHashTable *) dtdptr->notations;

View File

@@ -104,6 +104,7 @@ zend_result dom_entity_version_read(dom_object *obj, zval *retval);
zend_result dom_entity_reference_child_read(dom_object *obj, zval *retval);
zend_result dom_entity_reference_text_content_read(dom_object *obj, zval *retval);
zend_result dom_entity_reference_child_nodes_read(dom_object *obj, zval *retval);
zend_result dom_modern_entity_reference_child_nodes_read(dom_object *obj, zval *retval);
/* namednodemap properties */
zend_result dom_namednodemap_length_read(dom_object *obj, zval *retval);
@@ -122,6 +123,7 @@ zend_result dom_node_node_type_read(dom_object *obj, zval *retval);
zend_result dom_node_parent_node_read(dom_object *obj, zval *retval);
zend_result dom_node_parent_element_read(dom_object *obj, zval *retval);
zend_result dom_node_child_nodes_read(dom_object *obj, zval *retval);
zend_result dom_modern_node_child_nodes_read(dom_object *obj, zval *retval);
zend_result dom_node_first_child_read(dom_object *obj, zval *retval);
zend_result dom_node_last_child_read(dom_object *obj, zval *retval);
zend_result dom_node_previous_sibling_read(dom_object *obj, zval *retval);

View File

@@ -106,4 +106,12 @@ zend_result dom_entity_reference_child_nodes_read(dom_object *obj, zval *retval)
return dom_node_child_nodes_read(obj, retval);
}
zend_result dom_modern_entity_reference_child_nodes_read(dom_object *obj, zval *retval)
{
DOM_PROP_NODE(xmlNodePtr, nodep, obj);
dom_entity_reference_fetch_and_sync_declaration(nodep);
return dom_modern_node_child_nodes_read(obj, retval);
}
#endif

View File

@@ -294,7 +294,18 @@ zend_result dom_node_child_nodes_read(dom_object *obj, zval *retval)
{
DOM_PROP_NODE(xmlNodePtr, nodep, obj);
object_init_ex(retval, dom_get_nodelist_ce(php_dom_follow_spec_intern(obj)));
object_init_ex(retval, dom_get_nodelist_ce(false));
dom_object *intern = Z_DOMOBJ_P(retval);
php_dom_create_obj_map(obj, intern, NULL, NULL, NULL, &php_dom_obj_map_child_nodes);
return SUCCESS;
}
zend_result dom_modern_node_child_nodes_read(dom_object *obj, zval *retval)
{
DOM_PROP_NODE(xmlNodePtr, nodep, obj);
object_init_ex(retval, dom_get_nodelist_ce(true));
dom_object *intern = Z_DOMOBJ_P(retval);
php_dom_create_obj_map(obj, intern, NULL, NULL, NULL, &php_dom_obj_map_child_nodes);

View File

@@ -904,7 +904,7 @@ PHP_MINIT_FUNCTION(dom)
DOM_REGISTER_PROP_HANDLER(&dom_modern_node_prop_handlers, "ownerDocument", dom_node_owner_document_read, NULL);
DOM_REGISTER_PROP_HANDLER(&dom_modern_node_prop_handlers, "parentNode", dom_node_parent_node_read, NULL);
DOM_REGISTER_PROP_HANDLER(&dom_modern_node_prop_handlers, "parentElement", dom_node_parent_element_read, NULL);
DOM_REGISTER_PROP_HANDLER(&dom_modern_node_prop_handlers, "childNodes", dom_node_child_nodes_read, NULL);
DOM_REGISTER_PROP_HANDLER(&dom_modern_node_prop_handlers, "childNodes", dom_modern_node_child_nodes_read, NULL);
DOM_REGISTER_PROP_HANDLER(&dom_modern_node_prop_handlers, "firstChild", dom_node_first_child_read, NULL);
DOM_REGISTER_PROP_HANDLER(&dom_modern_node_prop_handlers, "lastChild", dom_node_last_child_read, NULL);
DOM_REGISTER_PROP_HANDLER(&dom_modern_node_prop_handlers, "previousSibling", dom_node_previous_sibling_read, NULL);
@@ -1305,7 +1305,7 @@ PHP_MINIT_FUNCTION(dom)
DOM_OVERWRITE_PROP_HANDLER(&dom_modern_entity_reference_prop_handlers, "firstChild", dom_entity_reference_child_read, NULL);
DOM_OVERWRITE_PROP_HANDLER(&dom_modern_entity_reference_prop_handlers, "lastChild", dom_entity_reference_child_read, NULL);
DOM_OVERWRITE_PROP_HANDLER(&dom_modern_entity_reference_prop_handlers, "textContent", dom_entity_reference_text_content_read, NULL);
DOM_OVERWRITE_PROP_HANDLER(&dom_modern_entity_reference_prop_handlers, "childNodes", dom_entity_reference_child_nodes_read, NULL);
DOM_OVERWRITE_PROP_HANDLER(&dom_modern_entity_reference_prop_handlers, "childNodes", dom_modern_entity_reference_child_nodes_read, NULL);
zend_hash_add_new_ptr(&classes, dom_modern_entityreference_class_entry->name, &dom_modern_entity_reference_prop_handlers);
dom_processinginstruction_class_entry = register_class_DOMProcessingInstruction(dom_node_class_entry);

View File

@@ -0,0 +1,49 @@
--TEST--
GH-21097 (Accessing Dom\Node properties can can throw TypeError(s))
--EXTENSIONS--
dom
--CREDITS--
mbeccati
--FILE--
<?php
$implementation = new \Dom\Implementation();
$node = $implementation->createDocumentType('html', 'publicId', 'systemId');
$r = new \ReflectionClass($node);
foreach ($r->getProperties(\ReflectionProperty::IS_PUBLIC) as $p) {
echo $p->getName(), ": ";
var_dump($node->{$p->getName()});
}
?>
--EXPECT--
nodeType: int(10)
nodeName: string(4) "html"
baseURI: string(11) "about:blank"
isConnected: bool(false)
ownerDocument: NULL
parentNode: NULL
parentElement: NULL
childNodes: object(Dom\NodeList)#24 (1) {
["length"]=>
int(0)
}
firstChild: NULL
lastChild: NULL
previousSibling: NULL
nextSibling: NULL
nodeValue: NULL
textContent: string(0) ""
name: string(4) "html"
entities: object(Dom\DtdNamedNodeMap)#24 (1) {
["length"]=>
int(0)
}
notations: object(Dom\DtdNamedNodeMap)#24 (1) {
["length"]=>
int(0)
}
publicId: string(8) "publicId"
systemId: string(8) "systemId"
internalSubset: NULL