Skip to content

Commit ceca599

Browse files
committed
Merge branch 'PHP-8.3'
* PHP-8.3: Fix UAF when removing doctype and using foreach iteration
2 parents 60afeb5 + 4049594 commit ceca599

File tree

4 files changed

+30
-4
lines changed

4 files changed

+30
-4
lines changed

ext/dom/dom_iterators.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ static xmlNodePtr dom_fetch_first_iteration_item(dom_nnodemap_object *objmap)
149149
if (objmap->nodetype == XML_ATTRIBUTE_NODE) {
150150
return (xmlNodePtr) basep->properties;
151151
} else {
152-
return basep->children;
152+
return dom_nodelist_iter_start_first_child(basep);
153153
}
154154
} else {
155155
int curindex = 0;

ext/dom/nodelist.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ static zend_always_inline void reset_objmap_cache(dom_nnodemap_object *objmap)
5050
objmap->cached_length = -1;
5151
}
5252

53-
static xmlNodePtr dom_nodelist_iter_start_first_child(xmlNodePtr nodep)
53+
xmlNodePtr dom_nodelist_iter_start_first_child(xmlNodePtr nodep)
5454
{
5555
if (nodep->type == XML_ENTITY_REF_NODE) {
5656
/* See entityreference.c */

ext/dom/php_dom.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,7 @@ void dom_mark_namespaces_as_attributes_too(php_dom_libxml_ns_mapper *ns_mapper,
180180
bool dom_compare_value(const xmlAttr *attr, const xmlChar *value);
181181
void dom_attr_value_will_change(dom_object *obj, xmlAttrPtr attrp);
182182
bool php_dom_create_nullable_object(xmlNodePtr obj, zval *return_value, dom_object *domobj);
183+
xmlNodePtr dom_clone_node(php_dom_libxml_ns_mapper *ns_mapper, xmlNodePtr node, xmlDocPtr doc, bool recursive);
183184

184185
typedef enum {
185186
DOM_LOAD_STRING = 0,
@@ -215,8 +216,7 @@ void php_dom_named_node_map_get_named_item_into_zval(dom_nnodemap_object *objmap
215216
xmlNodePtr php_dom_named_node_map_get_item(dom_nnodemap_object *objmap, zend_long index);
216217
void php_dom_named_node_map_get_item_into_zval(dom_nnodemap_object *objmap, zend_long index, zval *return_value);
217218
int php_dom_get_namednodemap_length(dom_object *obj);
218-
219-
xmlNodePtr dom_clone_node(php_dom_libxml_ns_mapper *ns_mapper, xmlNodePtr node, xmlDocPtr doc, bool recursive);
219+
xmlNodePtr dom_nodelist_iter_start_first_child(xmlNodePtr nodep);
220220

221221
#define DOM_GET_INTERN(__id, __intern) { \
222222
__intern = Z_DOMOBJ_P(__id); \
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
--TEST--
2+
UAF when removing doctype and iterating over the child nodes
3+
--EXTENSIONS--
4+
dom
5+
--CREDITS--
6+
Yuancheng Jiang
7+
--FILE--
8+
<?php
9+
$dom = new DOMDocument;
10+
$dom->loadXML(<<<XML
11+
<!DOCTYPE foo [
12+
<!ENTITY foo1 "bar1">
13+
]>
14+
<foo>&foo1;</foo>
15+
XML);
16+
$ref = $dom->documentElement->firstChild;
17+
$nodes = $ref->childNodes;
18+
$dom->removeChild($dom->doctype);
19+
foreach($nodes as $str) {}
20+
var_dump($nodes);
21+
?>
22+
--EXPECTF--
23+
object(DOMNodeList)#%d (1) {
24+
["length"]=>
25+
int(0)
26+
}

0 commit comments

Comments
 (0)