Skip to content

Commit 7fdf896

Browse files
committed
Merge branch 'PHP-8.2'
* PHP-8.2: Fix memory leak
2 parents 79f4634 + c0d49b7 commit 7fdf896

File tree

2 files changed

+32
-2
lines changed

2 files changed

+32
-2
lines changed

Zend/tests/gc_046.phpt

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
--TEST--
2+
GC 046: Leak in User Iterator
3+
--INI--
4+
zend.enable_gc=1
5+
--FILE--
6+
<?php
7+
class Action {
8+
function __construct() {
9+
$this->iterator = new ArrayIterator($this);
10+
}
11+
function filter() {
12+
$this->iterator = new CallbackFilterIterator($this->iterator, fn() => true);
13+
$this->iterator->rewind();
14+
}
15+
}
16+
17+
$action=new Action;
18+
$action->filter();
19+
$action->filter();
20+
?>
21+
DONE
22+
--EXPECT--
23+
DONE

Zend/zend_interfaces.c

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -184,8 +184,15 @@ ZEND_API void zend_user_it_rewind(zend_object_iterator *_iter)
184184
ZEND_API HashTable *zend_user_it_get_gc(zend_object_iterator *_iter, zval **table, int *n)
185185
{
186186
zend_user_iterator *iter = (zend_user_iterator*)_iter;
187-
*table = &iter->it.data;
188-
*n = 1;
187+
if (Z_ISUNDEF(iter->value)) {
188+
*table = &iter->it.data;
189+
*n = 1;
190+
} else {
191+
zend_get_gc_buffer *gc_buffer = zend_get_gc_buffer_create();
192+
zend_get_gc_buffer_add_zval(gc_buffer, &iter->it.data);
193+
zend_get_gc_buffer_add_zval(gc_buffer, &iter->value);
194+
zend_get_gc_buffer_use(gc_buffer, table, n);
195+
}
189196
return NULL;
190197
}
191198

0 commit comments

Comments
 (0)