Skip to content

Commit 983be08

Browse files
committed
Fix GH-20722: Null pointer dereference in DOM namespace node cloning via clone on malformed objects
Closes GH-20730.
1 parent 7c1830b commit 983be08

File tree

3 files changed

+24
-5
lines changed

3 files changed

+24
-5
lines changed

NEWS

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@ PHP NEWS
1313
. Fixed bug GH-20620 (bzcompress overflow on large source size).
1414
(David Carlier)
1515

16+
- DOM:
17+
. Fixed bug GH-20722 (Null pointer dereference in DOM namespace node cloning
18+
via clone on malformed objects). (ndossche)
19+
1620
- GD:
1721
. Fixed bug GH-20622 (imagestring/imagestringup overflow). (David Carlier)
1822

ext/dom/php_dom.c

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -541,15 +541,17 @@ static zend_object *dom_object_namespace_node_clone_obj(zend_object *zobject)
541541
zend_object *clone = dom_objects_namespace_node_new(intern->dom.std.ce);
542542
dom_object_namespace_node *clone_intern = php_dom_namespace_node_obj_from_obj(clone);
543543

544-
xmlNodePtr original_node = dom_object_get_node(&intern->dom);
545-
ZEND_ASSERT(original_node->type == XML_NAMESPACE_DECL);
546-
xmlNodePtr cloned_node = php_dom_create_fake_namespace_decl_node_ptr(original_node->parent, original_node->ns);
547-
548544
if (intern->parent_intern) {
549545
clone_intern->parent_intern = intern->parent_intern;
550546
GC_ADDREF(&clone_intern->parent_intern->std);
551547
}
552-
dom_update_refcount_after_clone(&intern->dom, original_node, &clone_intern->dom, cloned_node);
548+
549+
xmlNodePtr original_node = dom_object_get_node(&intern->dom);
550+
if (original_node != NULL) {
551+
ZEND_ASSERT(original_node->type == XML_NAMESPACE_DECL);
552+
xmlNodePtr cloned_node = php_dom_create_fake_namespace_decl_node_ptr(original_node->parent, original_node->ns);
553+
dom_update_refcount_after_clone(&intern->dom, original_node, &clone_intern->dom, cloned_node);
554+
}
553555

554556
zend_objects_clone_members(clone, &intern->dom.std);
555557
return clone;

ext/dom/tests/gh20722.phpt

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
--TEST--
2+
GH-20722 (Null pointer dereference in DOM namespace node cloning via clone on malformed objects)
3+
--EXTENSIONS--
4+
dom
5+
--FILE--
6+
<?php
7+
8+
clone new DOMNameSpaceNode();
9+
echo "Done";
10+
11+
?>
12+
--EXPECT--
13+
Done

0 commit comments

Comments
 (0)