Skip to content

Commit d906d8b

Browse files
committed
Merge branch 'PHP-8.1' into PHP-8.2
* PHP-8.1: Fix memory leak after GC inside a foreach loop (#12572)
2 parents 1707a53 + abe3673 commit d906d8b

File tree

2 files changed

+21
-1
lines changed

2 files changed

+21
-1
lines changed

Zend/tests/gc_047.phpt

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
--TEST--
2+
GC 047: Leak after GC inside a foreach loop
3+
--INI--
4+
zend.enable_gc=1
5+
--FILE--
6+
<?php
7+
$a = [0, 1];
8+
foreach($a as &$v) {
9+
$a[0] =& $a;
10+
$a[1] = array();
11+
$a[1][0] =& $a[1];
12+
$b = 1;
13+
$a =& $b;
14+
gc_collect_cycles();
15+
break;
16+
}
17+
var_dump(gc_collect_cycles());
18+
?>
19+
--EXPECT--
20+
int(2)

Zend/zend_gc.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -1726,7 +1726,7 @@ static void zend_gc_root_tmpvars(void) {
17261726
}
17271727

17281728
uint32_t kind = range->var & ZEND_LIVE_MASK;
1729-
if (kind == ZEND_LIVE_TMPVAR) {
1729+
if (kind == ZEND_LIVE_TMPVAR || kind == ZEND_LIVE_LOOP) {
17301730
uint32_t var_num = range->var & ~ZEND_LIVE_MASK;
17311731
zval *var = ZEND_CALL_VAR(ex, var_num);
17321732
if (Z_REFCOUNTED_P(var)) {

0 commit comments

Comments
 (0)