]> granicus.if.org Git - php/commitdiff
Revert "Fixed Bug #72213 (Finally leaks on nested exceptions)"
authorXinchen Hui <laruence@gmail.com>
Tue, 17 May 2016 12:27:16 +0000 (20:27 +0800)
committerXinchen Hui <laruence@gmail.com>
Tue, 17 May 2016 12:27:16 +0000 (20:27 +0800)
This reverts commit 5037ebf058bdc94e4426240a6d35fcf427d2eee2.

Zend/tests/try/bug72213.phpt [deleted file]
Zend/zend_vm_def.h
Zend/zend_vm_execute.h

diff --git a/Zend/tests/try/bug72213.phpt b/Zend/tests/try/bug72213.phpt
deleted file mode 100644 (file)
index 6240502..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
---TEST--
-Bug #72213 (Finally leaks on nested exceptions)
---FILE--
-<?php
-function test() {
-       try {
-               throw new Exception('a');
-       } finally {
-               try {
-                       throw new Exception('b');
-               } finally {
-               }
-       }
-}
-
-try {
-       test();
-} catch (Exception $e) {
-       var_dump($e->getMessage());
-       var_dump($e->getPrevious()->getMessage());
-}
-?>
---EXPECT--
-string(1) "b"
-string(1) "a"
index c4a97ab05601517437a25beb95e7b18f27a6626b..b2393c65b08a695f78f5df7ea98a97b3e1f9b2d1 100644 (file)
@@ -7087,7 +7087,7 @@ ZEND_VM_HANDLER(149, ZEND_HANDLE_EXCEPTION, ANY, ANY)
 {
        uint32_t op_num = EG(opline_before_exception) - EX(func)->op_array.opcodes;
        int i;
-       uint32_t catch_op_num = 0, finally_op_num = 0, finally_op_end = 0, prev_finally_op_end = 0;
+       uint32_t catch_op_num = 0, finally_op_num = 0, finally_op_end = 0;
        int in_finally = 0;
 
        {
@@ -7118,7 +7118,6 @@ ZEND_VM_HANDLER(149, ZEND_HANDLE_EXCEPTION, ANY, ANY)
                if (op_num >= EX(func)->op_array.try_catch_array[i].finally_op &&
                                op_num < EX(func)->op_array.try_catch_array[i].finally_end) {
                        finally_op_end = EX(func)->op_array.try_catch_array[i].finally_end;
-                       prev_finally_op_end = finally_op_end;
                        in_finally = 1;
                }
        }
@@ -7129,13 +7128,8 @@ ZEND_VM_HANDLER(149, ZEND_HANDLE_EXCEPTION, ANY, ANY)
                zval *fast_call = EX_VAR(EX(func)->op_array.opcodes[finally_op_end].op1.var);
 
                cleanup_live_vars(execute_data, op_num, finally_op_num);
-               if (prev_finally_op_end) {
-                       zval *prev_fast_call = EX_VAR(EX(func)->op_array.opcodes[prev_finally_op_end].op1.var);
-
-                       if (Z_OBJ_P(prev_fast_call)) {
-                               zend_exception_set_previous(EG(exception), Z_OBJ_P(prev_fast_call));
-                               Z_OBJ_P(prev_fast_call) = NULL;
-                       }
+               if (in_finally && Z_OBJ_P(fast_call)) {
+                       zend_exception_set_previous(EG(exception), Z_OBJ_P(fast_call));
                }
                Z_OBJ_P(fast_call) = EG(exception);
                EG(exception) = NULL;
index fc6f02a05522444e095ce3e36f8bcc9063bfecb9..2301d48e073e6a504308e5fdd0528764ecaeee24 100644 (file)
@@ -1694,7 +1694,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_HANDLE_EXCEPTION_SPEC_HANDLER(
 {
        uint32_t op_num = EG(opline_before_exception) - EX(func)->op_array.opcodes;
        int i;
-       uint32_t catch_op_num = 0, finally_op_num = 0, finally_op_end = 0, prev_finally_op_end = 0;
+       uint32_t catch_op_num = 0, finally_op_num = 0, finally_op_end = 0;
        int in_finally = 0;
 
        {
@@ -1725,7 +1725,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_HANDLE_EXCEPTION_SPEC_HANDLER(
                if (op_num >= EX(func)->op_array.try_catch_array[i].finally_op &&
                                op_num < EX(func)->op_array.try_catch_array[i].finally_end) {
                        finally_op_end = EX(func)->op_array.try_catch_array[i].finally_end;
-                       prev_finally_op_end = finally_op_end;
                        in_finally = 1;
                }
        }
@@ -1736,13 +1735,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_HANDLE_EXCEPTION_SPEC_HANDLER(
                zval *fast_call = EX_VAR(EX(func)->op_array.opcodes[finally_op_end].op1.var);
 
                cleanup_live_vars(execute_data, op_num, finally_op_num);
-               if (prev_finally_op_end) {
-                       zval *prev_fast_call = EX_VAR(EX(func)->op_array.opcodes[prev_finally_op_end].op1.var);
-
-                       if (Z_OBJ_P(prev_fast_call)) {
-                               zend_exception_set_previous(EG(exception), Z_OBJ_P(prev_fast_call));
-                               Z_OBJ_P(prev_fast_call) = NULL;
-                       }
+               if (in_finally && Z_OBJ_P(fast_call)) {
+                       zend_exception_set_previous(EG(exception), Z_OBJ_P(fast_call));
                }
                Z_OBJ_P(fast_call) = EG(exception);
                EG(exception) = NULL;