From: Xinchen Hui Date: Thu, 16 Aug 2012 10:17:26 +0000 (+0800) Subject: Prevents `goto` out of a finally block X-Git-Tag: php-5.5.0alpha1~20^2~73 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=0312d0a262e4e15ce49dddaa1b10492aba08ec38;p=php Prevents `goto` out of a finally block --- diff --git a/Zend/tests/try_finally_005.phpt b/Zend/tests/try_finally_005.phpt new file mode 100644 index 0000000000..e0937f1b16 --- /dev/null +++ b/Zend/tests/try_finally_005.phpt @@ -0,0 +1,17 @@ +--TEST-- +Finally with long goto +--FILE-- + +--EXPECTF-- +Fatal error: 'goto' out of a finally block is disallowed in %stry_finally_005.php on line %d diff --git a/Zend/tests/try_finally_006.phpt b/Zend/tests/try_finally_006.phpt new file mode 100644 index 0000000000..ba1c183eb4 --- /dev/null +++ b/Zend/tests/try_finally_006.phpt @@ -0,0 +1,18 @@ +--TEST-- +Finally with near goto +--FILE-- + +--EXPECTF-- +label diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 48b85f0b70..378cf17bff 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -2277,6 +2277,25 @@ void zend_resolve_goto_label(zend_op_array *op_array, zend_op *opline, int pass2 zval_dtor(label); Z_TYPE_P(label) = IS_NULL; + if (op_array->last_try_catch) { + zend_uint i, op_num = opline - CG(active_op_array)->opcodes; + for (i=0; ilast_try_catch; i++) { + if (op_array->try_catch_array[i].try_op > op_num) { + break; + } + if (op_num >= op_array->try_catch_array[i].finally_op) { + zend_op *p, *end; + p = opline; + end = op_array->opcodes + opline->op1.opline_num; + while (++p < end) { + if (p->opcode == ZEND_LEAVE) { + zend_error(E_COMPILE_ERROR, "'goto' out of a finally block is disallowed"); + } + } + } + } + } + /* Check that we are not moving into loop or switch */ current = opline->extended_value; for (distance = 0; current != dest->brk_cont; distance++) {