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 /Zend/zend_API.c | |
| parent | 65b1e128a99c6715acbca6c4df71e6d0cac84b88 (diff) | |
| download | php-git-106864bcbbd82290d1391b0077b663741d1a249d.tar.gz | |
- MFH Fix memleak with new error handling stack'ing
Diffstat (limited to 'Zend/zend_API.c')
| -rw-r--r-- | Zend/zend_API.c | 26 |
1 files changed, 18 insertions, 8 deletions
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; } /* }}} */ |
