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