@@ -553,13 +553,15 @@ static void spl_array_unset_dimension_ex(int check_inherited, zend_object *objec
553553 if (Z_TYPE_P (data ) == IS_INDIRECT ) {
554554 data = Z_INDIRECT_P (data );
555555 if (Z_TYPE_P (data ) != IS_UNDEF ) {
556- zval_ptr_dtor (data );
556+ zval garbage ;
557+ ZVAL_COPY_VALUE (& garbage , data );
557558 ZVAL_UNDEF (data );
558559 HT_FLAGS (ht ) |= HASH_FLAG_HAS_EMPTY_IND ;
559560 zend_hash_move_forward_ex (ht , spl_array_get_pos_ptr (ht , intern ));
560561 if (spl_array_is_object (intern )) {
561562 spl_array_skip_protected (intern , ht );
562563 }
564+ zval_ptr_dtor (& garbage );
563565 }
564566 } else {
565567 zend_hash_del (ht , key .key );
@@ -931,8 +933,10 @@ static zend_result spl_array_skip_protected(spl_array_object *intern, HashTable
931933static void spl_array_set_array (zval * object , spl_array_object * intern , zval * array , zend_long ar_flags , bool just_array ) {
932934 /* Handled by ZPP prior to this, or for __unserialize() before passing to here */
933935 ZEND_ASSERT (Z_TYPE_P (array ) == IS_ARRAY || Z_TYPE_P (array ) == IS_OBJECT );
936+ zval garbage ;
937+ ZVAL_UNDEF (& garbage );
934938 if (Z_TYPE_P (array ) == IS_ARRAY ) {
935- zval_ptr_dtor ( & intern -> array );
939+ ZVAL_COPY_VALUE ( & garbage , & intern -> array );
936940 if (Z_REFCOUNT_P (array ) == 1 ) {
937941 ZVAL_COPY (& intern -> array , array );
938942 } else {
@@ -950,7 +954,7 @@ static void spl_array_set_array(zval *object, spl_array_object *intern, zval *ar
950954 }
951955 } else {
952956 if (Z_OBJ_HT_P (array ) == & spl_handler_ArrayObject ) {
953- zval_ptr_dtor ( & intern -> array );
957+ ZVAL_COPY_VALUE ( & garbage , & intern -> array );
954958 if (just_array ) {
955959 spl_array_object * other = Z_SPLARRAY_P (array );
956960 ar_flags = other -> ar_flags & ~SPL_ARRAY_INT_MASK ;
@@ -968,15 +972,17 @@ static void spl_array_set_array(zval *object, spl_array_object *intern, zval *ar
968972 zend_throw_exception_ex (spl_ce_InvalidArgumentException , 0 ,
969973 "Overloaded object of type %s is not compatible with %s" ,
970974 ZSTR_VAL (Z_OBJCE_P (array )-> name ), ZSTR_VAL (intern -> std .ce -> name ));
975+ ZEND_ASSERT (Z_TYPE (garbage ) == IS_UNDEF );
971976 return ;
972977 }
973978 if (UNEXPECTED (Z_OBJCE_P (array )-> ce_flags & ZEND_ACC_ENUM )) {
974979 zend_throw_exception_ex (spl_ce_InvalidArgumentException , 0 ,
975980 "Enums are not compatible with %s" ,
976981 ZSTR_VAL (intern -> std .ce -> name ));
982+ ZEND_ASSERT (Z_TYPE (garbage ) == IS_UNDEF );
977983 return ;
978984 }
979- zval_ptr_dtor ( & intern -> array );
985+ ZVAL_COPY_VALUE ( & garbage , & intern -> array );
980986 ZVAL_COPY (& intern -> array , array );
981987 }
982988 }
@@ -987,6 +993,8 @@ static void spl_array_set_array(zval *object, spl_array_object *intern, zval *ar
987993 zend_hash_iterator_del (intern -> ht_iter );
988994 intern -> ht_iter = (uint32_t )-1 ;
989995 }
996+
997+ zval_ptr_dtor (& garbage );
990998}
991999/* }}} */
9921000
0 commit comments