Edit report at https://bugs.php.net/bug.php?id=65665&edit=1

 ID:                 65665
 Updated by:         larue...@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] larue...@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] krak...@php.net

Assuming we are just going to disable unsafe optimizations, PR #450 should do 
it 
???

------------------------------------------------------------------------
[2013-09-14 06:50:50] krak...@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] jpa...@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

Reply via email to