Bug #65665 [Asn->Csd]: Exception not properly caught when opcache enabled
Edit report at https://bugs.php.net/bug.php?id=65665&edit=1
ID: 65665
Updated by: laruence@php.net
Reported by: ryan dot brothers at gmail dot com
Summary: Exception not properly caught when opcache enabled
-Status: Assigned
+Status: Closed
Type: Bug
Package: opcache
Operating System: Linux
PHP Version: 5.5.3
Assigned To: dmitry
Block user comment: N
Private report: N
New Comment:
Automatic comment on behalf of laruence
Revision: http://git.php.net/?p=php-src.git;a=commit;h=46f18ccf0d11b18c3eebdd19d4057966dfcca6fe
Log: Fixed bug #65665 (Exception not properly caught when opcache enabled)
Previous Comments:
------------------------------------------------------------------------
[2013-09-15 06:06:10] laruence@php.net
Hey:
I got a different fix:
$ git diff
diff --git a/Optimizer/block_pass.c b/Optimizer/block_pass.c
index b8c3814..fd76322 100644
--- a/Optimizer/block_pass.c
+++ b/Optimizer/block_pass.c
@@ -1278,8 +1278,17 @@ static void assemble_code_blocks(zend_cfg *cfg,
zend_op_array *op_array)
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;
+ if (cfg->try[i]->access) {
+ op_array->try_catch_array[i].try_op = cfg->try[i]-
>start_opline - new_opcodes;
+ } else {
+ op_array->try_catch_array[i].try_op = 0;
+ }
+
+ if (cfg->catch[i]->access) {
+ op_array->try_catch_array[i].catch_op = cfg-
>catch[i]->start_opline - new_opcodes;
+ } else {
+ op_array->try_catch_array[i].catch_op = 0;
+ }
}
efree(cfg->try);
efree(cfg->catch);
dmitry, could you please verify this?
thanks
------------------------------------------------------------------------
[2013-09-14 06:58:51] krakjoe@php.net
Assuming we are just going to disable unsafe optimizations, PR #450 should do it
???
------------------------------------------------------------------------
[2013-09-14 06:50:50] krakjoe@php.net
Assuming
------------------------------------------------------------------------
[2013-09-13 17:16:34] Danack at basereality dot com
Running with -d opcache.optimization_level=0xfffffffd shows the correct behaviour.
That flag is the equivalent to turning on all optimizations except:
'ZEND_OPTIMIZER_PASS_2' /* Constant conversion and jumps */
------------------------------------------------------------------------
[2013-09-13 15:31:05] jpauli@php.net
This is an optimizer bug.
If you run with opcache.optimization_level=0 , the bug disappears.
I guess the bug is in the optimizer pass that handles ZEND_CATCH.
PS : I reproduced with a 5.4 base.
------------------------------------------------------------------------
The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at
https://bugs.php.net/bug.php?id=65665
--
Edit this bug report at https://bugs.php.net/bug.php?id=65665&edit=1
Thread (7 messages)