@@ -524,6 +524,20 @@ static zend_result spl_get_iterator_from_aggregate(zval *retval, zend_class_entr
524524 return SUCCESS ;
525525}
526526
527+ static void spl_RecursiveIteratorIterator_free_iterators (spl_recursive_it_object * object )
528+ {
529+ if (object -> iterators ) {
530+ while (object -> level >= 0 ) {
531+ zend_object_iterator * sub_iter = object -> iterators [object -> level ].iterator ;
532+ zend_iterator_dtor (sub_iter );
533+ zval_ptr_dtor (& object -> iterators [object -> level ].zobject );
534+ object -> level -- ;
535+ }
536+ efree (object -> iterators );
537+ object -> iterators = NULL ;
538+ }
539+ }
540+
527541static void spl_recursive_it_it_construct (INTERNAL_FUNCTION_PARAMETERS , zend_class_entry * ce_base , zend_class_entry * ce_inner , recursive_it_it_type rit_type )
528542{
529543 zval * object = ZEND_THIS ;
@@ -594,6 +608,7 @@ static void spl_recursive_it_it_construct(INTERNAL_FUNCTION_PARAMETERS, zend_cla
594608 }
595609
596610 intern = Z_SPLRECURSIVE_IT_P (object );
611+ spl_RecursiveIteratorIterator_free_iterators (intern );
597612 intern -> iterators = emalloc (sizeof (spl_sub_iterator ));
598613 intern -> level = 0 ;
599614 intern -> mode = mode ;
@@ -640,6 +655,7 @@ static void spl_recursive_it_it_construct(INTERNAL_FUNCTION_PARAMETERS, zend_cla
640655 intern -> iterators [0 ].getchildren = NULL ;
641656
642657 if (EG (exception )) {
658+ // TODO: use spl_RecursiveIteratorIterator_free_iterators
643659 zend_object_iterator * sub_iter ;
644660
645661 while (intern -> level >= 0 ) {
@@ -912,16 +928,7 @@ static void spl_RecursiveIteratorIterator_free_storage(zend_object *_object)
912928{
913929 spl_recursive_it_object * object = spl_recursive_it_from_obj (_object );
914930
915- if (object -> iterators ) {
916- while (object -> level >= 0 ) {
917- zend_object_iterator * sub_iter = object -> iterators [object -> level ].iterator ;
918- zend_iterator_dtor (sub_iter );
919- zval_ptr_dtor (& object -> iterators [object -> level ].zobject );
920- object -> level -- ;
921- }
922- efree (object -> iterators );
923- object -> iterators = NULL ;
924- }
931+ spl_RecursiveIteratorIterator_free_iterators (object );
925932
926933 zend_object_std_dtor (& object -> std );
927934 for (size_t i = 0 ; i < 6 ; i ++ ) {
0 commit comments