Skip to content

Commit 52eb174

Browse files
committed
Merge branch 'PHP-8.4' into PHP-8.5
* PHP-8.4: Fix GH-21097: Accessing Dom\Node properties can can throw TypeError(s)
2 parents 13f0fd9 + b8fc6bd commit 52eb174

File tree

7 files changed

+77
-5
lines changed

7 files changed

+77
-5
lines changed

NEWS

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ PHP NEWS
1717
- DOM:
1818
. Fixed bug GH-21077 (Accessing Dom\Node::baseURI can throw TypeError).
1919
(ndossche)
20+
. Fixed bug GH-21097 (Accessing Dom\Node properties can can throw TypeError).
21+
(ndossche)
2022

2123
- Windows:
2224
. Fixed compilation with clang (missing intrin.h include). (Kévin Dunglas)

ext/dom/documenttype.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ zend_result dom_documenttype_entities_read(dom_object *obj, zval *retval)
4949
{
5050
DOM_PROP_NODE(xmlDtdPtr, dtdptr, obj);
5151

52-
object_init_ex(retval, dom_get_dtd_namednodemap_ce(php_dom_follow_spec_intern(obj)));
52+
object_init_ex(retval, dom_get_dtd_namednodemap_ce(instanceof_function(obj->std.ce, dom_modern_documenttype_class_entry)));
5353

5454
xmlHashTable *entityht = (xmlHashTable *) dtdptr->entities;
5555

@@ -70,7 +70,7 @@ zend_result dom_documenttype_notations_read(dom_object *obj, zval *retval)
7070
{
7171
DOM_PROP_NODE(xmlDtdPtr, dtdptr, obj);
7272

73-
object_init_ex(retval, dom_get_dtd_namednodemap_ce(php_dom_follow_spec_intern(obj)));
73+
object_init_ex(retval, dom_get_dtd_namednodemap_ce(instanceof_function(obj->std.ce, dom_modern_documenttype_class_entry)));
7474

7575
xmlHashTable *notationht = (xmlHashTable *) dtdptr->notations;
7676

ext/dom/dom_properties.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ zend_result dom_entity_version_read(dom_object *obj, zval *retval);
104104
zend_result dom_entity_reference_child_read(dom_object *obj, zval *retval);
105105
zend_result dom_entity_reference_text_content_read(dom_object *obj, zval *retval);
106106
zend_result dom_entity_reference_child_nodes_read(dom_object *obj, zval *retval);
107+
zend_result dom_modern_entity_reference_child_nodes_read(dom_object *obj, zval *retval);
107108

108109
/* namednodemap properties */
109110
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);
122123
zend_result dom_node_parent_node_read(dom_object *obj, zval *retval);
123124
zend_result dom_node_parent_element_read(dom_object *obj, zval *retval);
124125
zend_result dom_node_child_nodes_read(dom_object *obj, zval *retval);
126+
zend_result dom_modern_node_child_nodes_read(dom_object *obj, zval *retval);
125127
zend_result dom_node_first_child_read(dom_object *obj, zval *retval);
126128
zend_result dom_node_last_child_read(dom_object *obj, zval *retval);
127129
zend_result dom_node_previous_sibling_read(dom_object *obj, zval *retval);

ext/dom/entityreference.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,4 +106,12 @@ zend_result dom_entity_reference_child_nodes_read(dom_object *obj, zval *retval)
106106
return dom_node_child_nodes_read(obj, retval);
107107
}
108108

109+
zend_result dom_modern_entity_reference_child_nodes_read(dom_object *obj, zval *retval)
110+
{
111+
DOM_PROP_NODE(xmlNodePtr, nodep, obj);
112+
113+
dom_entity_reference_fetch_and_sync_declaration(nodep);
114+
return dom_modern_node_child_nodes_read(obj, retval);
115+
}
116+
109117
#endif

ext/dom/node.c

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -287,7 +287,18 @@ zend_result dom_node_child_nodes_read(dom_object *obj, zval *retval)
287287
{
288288
DOM_PROP_NODE(xmlNodePtr, nodep, obj);
289289

290-
object_init_ex(retval, dom_get_nodelist_ce(php_dom_follow_spec_intern(obj)));
290+
object_init_ex(retval, dom_get_nodelist_ce(false));
291+
dom_object *intern = Z_DOMOBJ_P(retval);
292+
php_dom_create_obj_map(obj, intern, NULL, NULL, NULL, &php_dom_obj_map_child_nodes);
293+
294+
return SUCCESS;
295+
}
296+
297+
zend_result dom_modern_node_child_nodes_read(dom_object *obj, zval *retval)
298+
{
299+
DOM_PROP_NODE(xmlNodePtr, nodep, obj);
300+
301+
object_init_ex(retval, dom_get_nodelist_ce(true));
291302
dom_object *intern = Z_DOMOBJ_P(retval);
292303
php_dom_create_obj_map(obj, intern, NULL, NULL, NULL, &php_dom_obj_map_child_nodes);
293304

ext/dom/php_dom.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -904,7 +904,7 @@ PHP_MINIT_FUNCTION(dom)
904904
DOM_REGISTER_PROP_HANDLER(&dom_modern_node_prop_handlers, "ownerDocument", dom_node_owner_document_read, NULL);
905905
DOM_REGISTER_PROP_HANDLER(&dom_modern_node_prop_handlers, "parentNode", dom_node_parent_node_read, NULL);
906906
DOM_REGISTER_PROP_HANDLER(&dom_modern_node_prop_handlers, "parentElement", dom_node_parent_element_read, NULL);
907-
DOM_REGISTER_PROP_HANDLER(&dom_modern_node_prop_handlers, "childNodes", dom_node_child_nodes_read, NULL);
907+
DOM_REGISTER_PROP_HANDLER(&dom_modern_node_prop_handlers, "childNodes", dom_modern_node_child_nodes_read, NULL);
908908
DOM_REGISTER_PROP_HANDLER(&dom_modern_node_prop_handlers, "firstChild", dom_node_first_child_read, NULL);
909909
DOM_REGISTER_PROP_HANDLER(&dom_modern_node_prop_handlers, "lastChild", dom_node_last_child_read, NULL);
910910
DOM_REGISTER_PROP_HANDLER(&dom_modern_node_prop_handlers, "previousSibling", dom_node_previous_sibling_read, NULL);
@@ -1305,7 +1305,7 @@ PHP_MINIT_FUNCTION(dom)
13051305
DOM_OVERWRITE_PROP_HANDLER(&dom_modern_entity_reference_prop_handlers, "firstChild", dom_entity_reference_child_read, NULL);
13061306
DOM_OVERWRITE_PROP_HANDLER(&dom_modern_entity_reference_prop_handlers, "lastChild", dom_entity_reference_child_read, NULL);
13071307
DOM_OVERWRITE_PROP_HANDLER(&dom_modern_entity_reference_prop_handlers, "textContent", dom_entity_reference_text_content_read, NULL);
1308-
DOM_OVERWRITE_PROP_HANDLER(&dom_modern_entity_reference_prop_handlers, "childNodes", dom_entity_reference_child_nodes_read, NULL);
1308+
DOM_OVERWRITE_PROP_HANDLER(&dom_modern_entity_reference_prop_handlers, "childNodes", dom_modern_entity_reference_child_nodes_read, NULL);
13091309
zend_hash_add_new_ptr(&classes, dom_modern_entityreference_class_entry->name, &dom_modern_entity_reference_prop_handlers);
13101310

13111311
dom_processinginstruction_class_entry = register_class_DOMProcessingInstruction(dom_node_class_entry);
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
--TEST--
2+
GH-21097 (Accessing Dom\Node properties can can throw TypeError(s))
3+
--EXTENSIONS--
4+
dom
5+
--CREDITS--
6+
mbeccati
7+
--FILE--
8+
<?php
9+
10+
$implementation = new \Dom\Implementation();
11+
$node = $implementation->createDocumentType('html', 'publicId', 'systemId');
12+
13+
$r = new \ReflectionClass($node);
14+
foreach ($r->getProperties(\ReflectionProperty::IS_PUBLIC) as $p) {
15+
echo $p->getName(), ": ";
16+
var_dump($node->{$p->getName()});
17+
}
18+
19+
?>
20+
--EXPECT--
21+
nodeType: int(10)
22+
nodeName: string(4) "html"
23+
baseURI: string(11) "about:blank"
24+
isConnected: bool(false)
25+
ownerDocument: NULL
26+
parentNode: NULL
27+
parentElement: NULL
28+
childNodes: object(Dom\NodeList)#24 (1) {
29+
["length"]=>
30+
int(0)
31+
}
32+
firstChild: NULL
33+
lastChild: NULL
34+
previousSibling: NULL
35+
nextSibling: NULL
36+
nodeValue: NULL
37+
textContent: string(0) ""
38+
name: string(4) "html"
39+
entities: object(Dom\DtdNamedNodeMap)#24 (1) {
40+
["length"]=>
41+
int(0)
42+
}
43+
notations: object(Dom\DtdNamedNodeMap)#24 (1) {
44+
["length"]=>
45+
int(0)
46+
}
47+
publicId: string(8) "publicId"
48+
systemId: string(8) "systemId"
49+
internalSubset: NULL

0 commit comments

Comments
 (0)