File tree Expand file tree Collapse file tree 2 files changed +32
-2
lines changed Expand file tree Collapse file tree 2 files changed +32
-2
lines changed Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change @@ -184,8 +184,15 @@ ZEND_API void zend_user_it_rewind(zend_object_iterator *_iter)
184
184
ZEND_API HashTable * zend_user_it_get_gc (zend_object_iterator * _iter , zval * * table , int * n )
185
185
{
186
186
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
+ }
189
196
return NULL ;
190
197
}
191
198
You can’t perform that action at this time.
0 commit comments