From: Marcus Boerger Date: Mon, 11 Aug 2008 17:19:01 +0000 (+0000) Subject: - Fix memleak with new error handling stack'ing X-Git-Tag: BEFORE_HEAD_NS_CHANGE~769 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=320c9544026ab9b68ab31206c62cd306cefeb280;p=php - Fix memleak with new error handling stack'ing --- diff --git a/Zend/zend.h b/Zend/zend.h index 949fea3916..1adcf571a3 100644 --- a/Zend/zend.h +++ b/Zend/zend.h @@ -805,11 +805,12 @@ typedef enum { typedef struct { zend_error_handling_t handling; zend_class_entry *exception; + zval *user_handler; } zend_error_handling; ZEND_API void zend_save_error_handling(zend_error_handling *current TSRMLS_DC); ZEND_API void zend_replace_error_handling(zend_error_handling_t error_handling, zend_class_entry *exception_class, zend_error_handling *current TSRMLS_DC); -ZEND_API void zend_restore_error_handling(const zend_error_handling *saved TSRMLS_DC); +ZEND_API void zend_restore_error_handling(zend_error_handling *saved TSRMLS_DC); #define ZEND_U_EQUAL(type, ustr, ulen, str, slen) \ ((type == IS_STRING)? \ diff --git a/Zend/zend_API.c b/Zend/zend_API.c index b4bda2c186..62c7d15912 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -4289,6 +4289,10 @@ ZEND_API void zend_save_error_handling(zend_error_handling *current TSRMLS_DC) / { current->handling = EG(error_handling); current->exception = EG(exception_class); + current->user_handler = EG(user_error_handler); + if (current->user_handler) { + Z_ADDREF_P(current->user_handler); + } } /* }}} */ @@ -4296,23 +4300,29 @@ ZEND_API void zend_replace_error_handling(zend_error_handling_t error_handling, { if (current) { zend_save_error_handling(current TSRMLS_CC); + if (error_handling != EH_NORMAL && EG(user_error_handler)) { + zval_ptr_dtor(&EG(user_error_handler)); + EG(user_error_handler) = NULL; + } } EG(error_handling) = error_handling; EG(exception_class) = error_handling == EH_THROW ? exception_class : NULL; - - if (error_handling == EH_NORMAL) { - EG(user_error_handler) = EG(user_error_handler_old); - } else { - EG(user_error_handler_old) = EG(user_error_handler); - EG(user_error_handler) = NULL; - } } /* }}} */ -ZEND_API void zend_restore_error_handling(const zend_error_handling *saved TSRMLS_DC) /* {{{ */ +ZEND_API void zend_restore_error_handling(zend_error_handling *saved TSRMLS_DC) /* {{{ */ { EG(error_handling) = saved->handling; EG(exception_class) = saved->handling == EH_THROW ? saved->exception : NULL; + if (saved->user_handler && saved->user_handler != EG(user_error_handler)) { + if (EG(user_error_handler)) { + zval_ptr_dtor(&EG(user_error_handler)); + } + EG(user_error_handler) = saved->user_handler; + } else if (saved->user_handler) { + zval_ptr_dtor(&saved->user_handler); + } + saved->user_handler = NULL; } /* }}} */ diff --git a/Zend/zend_globals.h b/Zend/zend_globals.h index 388cafb19a..d075af337b 100644 --- a/Zend/zend_globals.h +++ b/Zend/zend_globals.h @@ -210,7 +210,6 @@ struct _zend_executor_globals { int user_error_handler_error_reporting; zval *user_error_handler; - zval *user_error_handler_old; zval *user_exception_handler; zend_stack user_error_handlers_error_reporting; zend_ptr_stack user_error_handlers;