summaryrefslogtreecommitdiff
path: root/Zend/zend_API.c
diff options
context:
space:
mode:
authorMarcus Boerger <helly@php.net>2008-08-11 17:19:20 +0000
committerMarcus Boerger <helly@php.net>2008-08-11 17:19:20 +0000
commit106864bcbbd82290d1391b0077b663741d1a249d (patch)
tree28fc84d2cbd4ab63b614523ebb5d40c2fee5299f /Zend/zend_API.c
parent65b1e128a99c6715acbca6c4df71e6d0cac84b88 (diff)
downloadphp-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.c26
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;
}
/* }}} */