]> granicus.if.org Git - php/commitdiff
Keeping consistent arg_stack during arguments freeing (Exception from destructor...
authorDmitry Stogov <dmitry@php.net>
Wed, 31 May 2006 13:01:57 +0000 (13:01 +0000)
committerDmitry Stogov <dmitry@php.net>
Wed, 31 May 2006 13:01:57 +0000 (13:01 +0000)
Zend/zend_builtin_functions.c
Zend/zend_execute.h

index 3d243113105587c75539d22461895a0de83a91eb..87ead12e3a0de9fb992e20efd248663cd96fa77e 100644 (file)
@@ -1628,9 +1628,13 @@ static zval *debug_backtrace_get_args(void ***curpos TSRMLS_DC)
 
        while (--arg_count >= 0) {
                arg = (zval **) p++;
-               SEPARATE_ZVAL_TO_MAKE_IS_REF(arg);
-               (*arg)->refcount++;
-               add_next_index_zval(arg_array, *arg);
+               if (*arg) {
+                       SEPARATE_ZVAL_TO_MAKE_IS_REF(arg);
+                       (*arg)->refcount++;
+                       add_next_index_zval(arg_array, *arg);
+               } else {
+                       add_next_index_null(arg_array);
+               }
        }
 
        /* skip args from incomplete frames */
index b3b084bd66ea229181d6ed97f6ca8e1d7dae417d..a76c6885139c272046b61c1465d10c25f74b772d 100644 (file)
@@ -136,7 +136,9 @@ static inline void zend_ptr_stack_clear_multiple(TSRMLS_D)
 
        EG(argument_stack).top -= (delete_count+2);
        while (--delete_count>=0) {
-               zval_ptr_dtor((zval **) --p);
+               zval *q = *(zval **)(--p);
+               *p = NULL;
+               zval_ptr_dtor(&q);
        }
        EG(argument_stack).top_element = p;
 }