Bug #65665 [Asn->Csd]: Exception not properly caught when opcache enabled

From: Date: Mon, 16 Sep 2013 06:42:52 +0000
Subject: Bug #65665 [Asn->Csd]: Exception not properly caught when opcache enabled
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-181595@lists.php.net to get a copy of this message
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)

« previous php.bugs (#181595) next »