File tree Expand file tree Collapse file tree 2 files changed +25
-8
lines changed Expand file tree Collapse file tree 2 files changed +25
-8
lines changed Original file line number Diff line number Diff line change @@ -160,16 +160,18 @@ static void spl_recursive_it_dtor(zend_object_iterator *_iter)
160
160
spl_recursive_it_object * object = Z_SPLRECURSIVE_IT_P (& iter -> intern .data );
161
161
zend_object_iterator * sub_iter ;
162
162
163
- while (object -> level > 0 ) {
164
- if (!Z_ISUNDEF (object -> iterators [object -> level ].zobject )) {
165
- sub_iter = object -> iterators [object -> level ].iterator ;
166
- zend_iterator_dtor (sub_iter );
167
- zval_ptr_dtor (& object -> iterators [object -> level ].zobject );
163
+ if (object -> iterators ) {
164
+ while (object -> level > 0 ) {
165
+ if (!Z_ISUNDEF (object -> iterators [object -> level ].zobject )) {
166
+ sub_iter = object -> iterators [object -> level ].iterator ;
167
+ zend_iterator_dtor (sub_iter );
168
+ zval_ptr_dtor (& object -> iterators [object -> level ].zobject );
169
+ }
170
+ object -> level -- ;
168
171
}
169
- object -> level -- ;
172
+ object -> iterators = erealloc (object -> iterators , sizeof (spl_sub_iterator ));
173
+ object -> level = 0 ;
170
174
}
171
- object -> iterators = erealloc (object -> iterators , sizeof (spl_sub_iterator ));
172
- object -> level = 0 ;
173
175
174
176
zval_ptr_dtor (& iter -> intern .data );
175
177
}
@@ -905,6 +907,7 @@ static void spl_RecursiveIteratorIterator_free_storage(zend_object *_object)
905
907
object -> level -- ;
906
908
}
907
909
efree (object -> iterators );
910
+ object -> iterators = NULL ;
908
911
}
909
912
910
913
zend_object_std_dtor (& object -> std );
Original file line number Diff line number Diff line change
1
+ --TEST--
2
+ Handle object_iterator being destroyed before the RecursiveIteratorIterator object
3
+ --FILE--
4
+ <?php
5
+
6
+ $ dummy = new stdClass ; // Dummy object to control object store ordering
7
+ $ it = new RecursiveIteratorIterator (new RecursiveArrayIterator ([1 ]));
8
+ unset($ dummy );
9
+ foreach ($ it as $ v ) {
10
+ eval ('class self {} ' ); // Cause a bailout.
11
+ }
12
+ ?>
13
+ --EXPECTF--
14
+ Fatal error: Cannot use 'self' as class name as it is reserved in %s on line %d
You can’t perform that action at this time.
0 commit comments