@@ -116,15 +116,18 @@ void zend_exception_set_previous(zend_object *exception, zend_object *add_previo
116116	ex  =  & zv ;
117117	do  {
118118		ancestor  =  zend_read_property_ex (i_get_exception_base (add_previous ), add_previous , ZSTR_KNOWN (ZEND_STR_PREVIOUS ), 1 , & rv );
119+ 		ZVAL_DEREF (ancestor );
119120		while  (Z_TYPE_P (ancestor ) ==  IS_OBJECT ) {
120121			if  (Z_OBJ_P (ancestor ) ==  Z_OBJ_P (ex )) {
121122				OBJ_RELEASE (add_previous );
122123				return ;
123124			}
124125			ancestor  =  zend_read_property_ex (i_get_exception_base (Z_OBJ_P (ancestor )), Z_OBJ_P (ancestor ), ZSTR_KNOWN (ZEND_STR_PREVIOUS ), 1 , & rv );
126+ 			ZVAL_DEREF (ancestor );
125127		}
126128		base_ce  =  i_get_exception_base (Z_OBJ_P (ex ));
127129		previous  =  zend_read_property_ex (base_ce , Z_OBJ_P (ex ), ZSTR_KNOWN (ZEND_STR_PREVIOUS ), 1 , & rv );
130+ 		ZVAL_DEREF (previous );
128131		if  (Z_TYPE_P (previous ) ==  IS_NULL ) {
129132			zend_update_property_ex (base_ce , Z_OBJ_P (ex ), ZSTR_KNOWN (ZEND_STR_PREVIOUS ), & pv );
130133			GC_DELREF (add_previous );
@@ -626,6 +629,7 @@ ZEND_METHOD(Exception, getTraceAsString)
626629		RETURN_THROWS ();
627630	}
628631
632+ 	ZVAL_DEREF (trace );
629633	/* Type should be guaranteed by property type. */ 
630634	ZEND_ASSERT (Z_TYPE_P (trace ) ==  IS_ARRAY );
631635	RETURN_NEW_STR (zend_trace_to_string (Z_ARRVAL_P (trace ), /* include_main */  true));
@@ -639,7 +643,7 @@ ZEND_METHOD(Exception, getPrevious)
639643
640644	ZEND_PARSE_PARAMETERS_NONE ();
641645
642- 	ZVAL_COPY (return_value , GET_PROPERTY_SILENT (ZEND_THIS , ZEND_STR_PREVIOUS ));
646+ 	ZVAL_COPY_DEREF (return_value , GET_PROPERTY_SILENT (ZEND_THIS , ZEND_STR_PREVIOUS ));
643647} /* }}} */ 
644648
645649/* {{{ Obtain the string representation of the Exception object */ 
@@ -713,21 +717,23 @@ ZEND_METHOD(Exception, __toString)
713717
714718		Z_PROTECT_RECURSION_P (exception );
715719		exception  =  GET_PROPERTY (exception , ZEND_STR_PREVIOUS );
716- 		if  (exception  &&  Z_TYPE_P (exception ) ==  IS_OBJECT  &&  Z_IS_RECURSIVE_P (exception )) {
720+ 		ZVAL_DEREF (exception );
721+ 		if  (Z_TYPE_P (exception ) ==  IS_OBJECT  &&  Z_IS_RECURSIVE_P (exception )) {
717722			break ;
718723		}
719724	}
720725	zend_string_release_ex (fname , 0 );
721726
722727	exception  =  ZEND_THIS ;
723728	/* Reset apply counts */ 
724- 	while  (exception   &&   Z_TYPE_P (exception ) ==  IS_OBJECT  &&  (base_ce  =  i_get_exception_base (Z_OBJ_P (exception ))) &&  instanceof_function (Z_OBJCE_P (exception ), base_ce )) {
729+ 	while  (Z_TYPE_P (exception ) ==  IS_OBJECT  &&  (base_ce  =  i_get_exception_base (Z_OBJ_P (exception ))) &&  instanceof_function (Z_OBJCE_P (exception ), base_ce )) {
725730		if  (Z_IS_RECURSIVE_P (exception )) {
726731			Z_UNPROTECT_RECURSION_P (exception );
727732		} else  {
728733			break ;
729734		}
730735		exception  =  GET_PROPERTY (exception , ZEND_STR_PREVIOUS );
736+ 		ZVAL_DEREF (exception );
731737	}
732738
733739	exception  =  ZEND_THIS ;
0 commit comments