summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXinchen Hui <laruence@php.net>2013-09-16 14:43:01 +0800
committerXinchen Hui <laruence@php.net>2013-09-16 14:43:01 +0800
commit46f18ccf0d11b18c3eebdd19d4057966dfcca6fe (patch)
tree5c3f5c8d917445a808b7ed8bea1b1067533063e5
parent9eaffd34c123ae5782054cd32bf6caa50ff2b7d2 (diff)
downloadphp-git-46f18ccf0d11b18c3eebdd19d4057966dfcca6fe.tar.gz
Fixed bug #65665 (Exception not properly caught when opcache enabled)
-rw-r--r--NEWS2
-rw-r--r--ext/opcache/Optimizer/block_pass.c12
-rw-r--r--ext/opcache/tests/bug65665.phpt118
3 files changed, 128 insertions, 4 deletions
diff --git a/NEWS b/NEWS
index 5ec672eeda..37db7e6c40 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 43ae30419f..1c34cffbf7 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 0000000000..ac5c18dd83
--- /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