summaryrefslogtreecommitdiff
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
parent65b1e128a99c6715acbca6c4df71e6d0cac84b88 (diff)
downloadphp-git-106864bcbbd82290d1391b0077b663741d1a249d.tar.gz
- MFH Fix memleak with new error handling stack'ing
-rw-r--r--Zend/zend.h3
-rw-r--r--Zend/zend_API.c26
-rw-r--r--Zend/zend_globals.h1
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;