]> granicus.if.org Git - php/commitdiff
- Fix memleak with new error handling stack'ing
authorMarcus Boerger <helly@php.net>
Mon, 11 Aug 2008 17:19:01 +0000 (17:19 +0000)
committerMarcus Boerger <helly@php.net>
Mon, 11 Aug 2008 17:19:01 +0000 (17:19 +0000)
Zend/zend.h
Zend/zend_API.c
Zend/zend_globals.h

index 949fea3916bf49e9fb80274daf757508eedf78d9..1adcf571a3414a3b50f724d8ff472f2716eca8de 100644 (file)
@@ -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)? \
index b4bda2c1864eea5c598bfc555b0005d03eb74d61..62c7d15912f9e2fc168a2e2283d6c6b545ee599e 100644 (file)
@@ -4289,6 +4289,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);
+       }
 }
 /* }}} */
 
@@ -4296,23 +4300,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;
 }
 /* }}} */
 
index 388cafb19ac8041033d055427924e136b75df940..d075af337b65f34f5500480935ff3f2920a42984 100644 (file)
@@ -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;