Skip to content

Commit e5d837c

Browse files
committed
Merge branch 'PHP-8.2' into PHP-8.3
* PHP-8.2: Fix uaf in SplDoublyLinkedList::offsetSet()
2 parents 931762c + 8820a10 commit e5d837c

File tree

3 files changed

+34
-1
lines changed

3 files changed

+34
-1
lines changed

NEWS

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,8 @@ PHP NEWS
7474

7575
- SPL:
7676
. Fixed bug GH-16337 (Use-after-free in SplHeap). (nielsdos)
77+
. Fixed bug GH-16464 (Use-after-free in SplDoublyLinkedList::offsetSet()).
78+
(ilutov)
7779

7880
- Standard:
7981
. Fixed bug GH-16293 (Failed assertion when throwing in assert() callback with

ext/spl/spl_dllist.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -736,8 +736,10 @@ PHP_METHOD(SplDoublyLinkedList, offsetSet)
736736
if (element != NULL) {
737737
/* the element is replaced, delref the old one as in
738738
* SplDoublyLinkedList::pop() */
739-
zval_ptr_dtor(&element->data);
739+
zval garbage;
740+
ZVAL_COPY_VALUE(&garbage, &element->data);
740741
ZVAL_COPY(&element->data, value);
742+
zval_ptr_dtor(&garbage);
741743
} else {
742744
zval_ptr_dtor(value);
743745
zend_argument_error(spl_ce_OutOfRangeException, 1, "is an invalid offset");

ext/spl/tests/gh16464.phpt

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
--TEST--
2+
GH-16464: Use-after-free in SplDoublyLinkedList::offsetSet() when modifying list in destructor of overwritten object
3+
--FILE--
4+
<?php
5+
6+
class C {
7+
public $a;
8+
9+
function __destruct() {
10+
global $list;
11+
var_dump($list->pop());
12+
}
13+
}
14+
15+
$list = new SplDoublyLinkedList;
16+
$list->add(0, new C);
17+
$list[0] = 42;
18+
var_dump($list);
19+
20+
?>
21+
--EXPECTF--
22+
int(42)
23+
object(SplDoublyLinkedList)#%d (2) {
24+
["flags":"SplDoublyLinkedList":private]=>
25+
int(0)
26+
["dllist":"SplDoublyLinkedList":private]=>
27+
array(0) {
28+
}
29+
}

0 commit comments

Comments
 (0)