com php-src: Fixed bug #65665 (Exception not properly caught when opcache enabled): NEWS ext/opcache/Optimizer/block_pass.c ext/opc
ache/tests/bug65665.phpt
| From: | Xinchen Hui | Date: | Mon, 16 Sep 2013 06:43:01 +0000 |
| Subject: | com php-src: Fixed bug #65665 (Exception not properly caught when opcache enabled): NEWS ext/opcache/Optimizer/block_pass.c ext/opc ache/tests/bug65665.phpt |
||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-73198@lists.php.net to get a copy of this message | ||
Commit: 46f18ccf0d11b18c3eebdd19d4057966dfcca6fe
Author: Xinchen Hui <laruence@php.net> Mon, 16 Sep 2013 14:43:01 +0800
Parents: 9eaffd34c123ae5782054cd32bf6caa50ff2b7d2
Branches: PHP-5.5 master
Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=46f18ccf0d11b18c3eebdd19d4057966dfcca6fe
Log:
Fixed bug #65665 (Exception not properly caught when opcache enabled)
Bugs:
https://bugs.php.net/65665
Changed paths:
M NEWS
M ext/opcache/Optimizer/block_pass.c
A ext/opcache/tests/bug65665.phpt
Diff:
diff --git a/NEWS b/NEWS
index 5ec672e..37db7e6 100644
--- a/NEWS
+++ b/NEWS
@@ -17,6 +17,8 @@ PHP NEWS
scaling methods. (Pierre)
- OPcache:
+ . Fixed bug #65665 (Exception not properly caught when opcache enabled).
+ (Laruence)
. Fixed bug #65510 (5.5.2 crashes in _get_zval_ptr_ptr_var). (Dmitry)
- SPL:
diff --git a/ext/opcache/Optimizer/block_pass.c b/ext/opcache/Optimizer/block_pass.c
index 43ae304..1c34cff 100644
--- a/ext/opcache/Optimizer/block_pass.c
+++ b/ext/opcache/Optimizer/block_pass.c
@@ -1283,11 +1283,15 @@ static void assemble_code_blocks(zend_cfg *cfg, zend_op_array *op_array)
/* adjust exception jump targets */
if (op_array->last_try_catch) {
- int i;
- for (i = 0; i< op_array->last_try_catch; i++) {
- op_array->try_catch_array[i].try_op = cfg->try[i]->start_opline - new_opcodes;
- op_array->try_catch_array[i].catch_op = cfg->catch[i]->start_opline - new_opcodes;
+ int i, j;
+ for (i = 0, j = 0; i< op_array->last_try_catch; i++) {
+ if (cfg->try[i]->access) {
+ op_array->try_catch_array[j].try_op = cfg->try[i]->start_opline - new_opcodes;
+ op_array->try_catch_array[j].catch_op = cfg->catch[i]->start_opline - new_opcodes;
+ j++;
+ }
}
+ op_array->last_try_catch = j;
efree(cfg->try);
efree(cfg->catch);
}
diff --git a/ext/opcache/tests/bug65665.phpt b/ext/opcache/tests/bug65665.phpt
new file mode 100644
index 0000000..ac5c18d
--- /dev/null
+++ b/ext/opcache/tests/bug65665.phpt
@@ -0,0 +1,118 @@
+--TEST--
+Bug #65665 (Exception not properly caught when opcache enabled)
+--INI--
+opcache.enable=1
+opcache.enable_cli=1
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+function foo() {
+ try
+ {
+ switch (1)
+ {
+ case 0:
+ try
+ {
+
+ }
+ catch (Exception $e)
+ {
+
+ }
+
+ break;
+
+ case 1:
+ try
+ {
+ throw new Exception('aaa');
+ }
+ catch (Exception $e)
+ {
+ echo "correct\n";
+ }
+
+ break;
+ }
+ }
+ catch (Exception $e)
+ {
+ echo "wrong\n";
+ }
+ return;
+}
+
+function foo1() {
+ try
+ {
+ switch (1)
+ {
+ case 0:
+ try
+ {
+
+ }
+ catch (Exception $e)
+ {
+dummy:
+ echo "ect\n";
+ }
+
+ break;
+
+ case 1:
+ try
+ {
+ throw new Exception('aaa');
+ }
+ catch (Exception $e)
+ {
+ echo "corr";
+ goto dummy;
+ }
+ break;
+ }
+ }
+ catch (Exception $e)
+ {
+ echo "wrong\n";
+ }
+ return;
+}
+
+function foo2() {
+ try
+ {
+ switch (1)
+ {
+ case 0:
+ try
+ {
+dummy:
+ throw new Exception('aaa');
+ }
+ catch (Exception $e)
+ {
+ echo "correct\n";
+ }
+
+ break;
+
+ case 1:
+ goto dummy;
+ break;
+ }
+ }
+ catch (Exception $e)
+ {
+ echo "wrong\n";
+ }
+ return;
+}
+foo();foo1();foo2();
+--EXPECT--
+correct
+correct
+correct