@@ -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