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 @@ -185,8 +185,15 @@ ZEND_API void zend_user_it_rewind(zend_object_iterator *_iter)
185185ZEND_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
You can’t perform that action at this time.
0 commit comments