Skip to content

Commit 4049594

Browse files
committed
Merge branch 'PHP-8.2' into PHP-8.3
* PHP-8.2: Fix UAF when removing doctype and using foreach iteration
2 parents e077186 + b282dd7 commit 4049594

File tree

5 files changed

+32
-2
lines changed

5 files changed

+32
-2
lines changed

NEWS

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@ PHP NEWS
1616
. Fixed case when curl_error returns an empty string.
1717
(David Carlier)
1818

19+
- DOM:
20+
. Fix UAF when removing doctype and using foreach iteration. (nielsdos)
21+
1922
- FFI:
2023
. Fixed bug GH-14286 (ffi enum type (when enum has no name) make memory
2124
leak). (nielsdos, dstogov)

ext/dom/dom_iterators.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -305,7 +305,7 @@ zend_object_iterator *php_dom_get_iterator(zend_class_entry *ce, zval *object, i
305305
if (objmap->nodetype == XML_ATTRIBUTE_NODE) {
306306
curnode = (xmlNodePtr) basep->properties;
307307
} else {
308-
curnode = (xmlNodePtr) basep->children;
308+
curnode = dom_nodelist_iter_start_first_child(basep);
309309
}
310310
} else {
311311
xmlNodePtr nodep = basep;

ext/dom/nodelist.c

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

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

ext/dom/php_dom.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,7 @@ void php_dom_named_node_map_get_item_into_zval(dom_nnodemap_object *objmap, zend
174174
void php_dom_nodelist_get_item_into_zval(dom_nnodemap_object *objmap, zend_long index, zval *return_value);
175175
int php_dom_get_namednodemap_length(dom_object *obj);
176176
int php_dom_get_nodelist_length(dom_object *obj);
177+
xmlNodePtr dom_nodelist_iter_start_first_child(xmlNodePtr nodep);
177178

178179
#define DOM_GET_INTERN(__id, __intern) { \
179180
__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)