Skip to content

Commit 8a1f7fa

Browse files
committed
Fix memory leak
Fixes oss-fuzz #51451
1 parent 54701ea commit 8a1f7fa

File tree

2 files changed

+32
-2
lines changed

2 files changed

+32
-2
lines changed

Zend/tests/gc_046.phpt

+23
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

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

0 commit comments

Comments
 (0)