diff options
author | Marcus Boerger <helly@php.net> | 2008-08-11 17:19:20 +0000 |
---|---|---|
committer | Marcus Boerger <helly@php.net> | 2008-08-11 17:19:20 +0000 |
commit | 106864bcbbd82290d1391b0077b663741d1a249d (patch) | |
tree | 28fc84d2cbd4ab63b614523ebb5d40c2fee5299f | |
parent | 65b1e128a99c6715acbca6c4df71e6d0cac84b88 (diff) | |
download | php-git-106864bcbbd82290d1391b0077b663741d1a249d.tar.gz |
- MFH Fix memleak with new error handling stack'ing
-rw-r--r-- | Zend/zend.h | 3 | ||||
-rw-r--r-- | Zend/zend_API.c | 26 | ||||
-rw-r--r-- | Zend/zend_globals.h | 1 |
3 files changed, 20 insertions, 10 deletions
diff --git a/Zend/zend.h b/Zend/zend.h index 7f8201c743..6c0caf8ad6 100644 --- a/Zend/zend.h +++ b/Zend/zend.h @@ -752,11 +752,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); #endif /* ZEND_H */ diff --git a/Zend/zend_API.c b/Zend/zend_API.c index e15109bcff..c8ecc34a98 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -3467,6 +3467,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); + } } /* }}} */ @@ -3474,23 +3478,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 53b30cfae8..fb27175525 100644 --- a/Zend/zend_globals.h +++ b/Zend/zend_globals.h @@ -222,7 +222,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; |