Skip to content

Commit

Permalink
- Fix memleak with new error handling stack'ing
Browse files Browse the repository at this point in the history
  • Loading branch information
helly25 committed Aug 11, 2008
1 parent 8da607e commit 320c954
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 10 deletions.
3 changes: 2 additions & 1 deletion Zend/zend.h
Expand Up @@ -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)? \
Expand Down
26 changes: 18 additions & 8 deletions Zend/zend_API.c
Expand Up @@ -4289,30 +4289,40 @@ 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);
}
}
/* }}} */

ZEND_API void zend_replace_error_handling(zend_error_handling_t error_handling, zend_class_entry *exception_class, zend_error_handling *current TSRMLS_DC) /* {{{ */
{
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;
}
/* }}} */

Expand Down
1 change: 0 additions & 1 deletion Zend/zend_globals.h
Expand Up @@ -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;
Expand Down

0 comments on commit 320c954

Please sign in to comment.