diff options
author | Dmitry Stogov <dmitry@zend.com> | 2013-12-13 11:17:50 +0400 |
---|---|---|
committer | Dmitry Stogov <dmitry@zend.com> | 2013-12-13 11:17:50 +0400 |
commit | af66b207816e29bd7e8e8798ef438cfe53b5521e (patch) | |
tree | c4de5c79d384242a8b3bbed81d028054e42154ac /Zend/zend_opcode.c | |
parent | 3bddcc13b5c9f6aa0cf6113b8009c621b7867fd5 (diff) | |
parent | 6f95a07c411fa78092427c6edd2d867d0f085b73 (diff) | |
download | php-git-af66b207816e29bd7e8e8798ef438cfe53b5521e.tar.gz |
Merge branch 'PHP-5.6' of git.php.net:php-src into PHP-5.6
* 'PHP-5.6' of git.php.net:php-src:
Use zend_error_noreturn here
OCI8 build change: Fix source variable definition for C89 compatibility
Add Tests for #65784 in 5.5
Disallowed JMP into a finally block.
Update NEWS for 5.5.7 release
Fixed bug #65784 (Segfault with finally).
Diffstat (limited to 'Zend/zend_opcode.c')
-rw-r--r-- | Zend/zend_opcode.c | 25 |
1 files changed, 15 insertions, 10 deletions
diff --git a/Zend/zend_opcode.c b/Zend/zend_opcode.c index ad08798884..ac16e81ef1 100644 --- a/Zend/zend_opcode.c +++ b/Zend/zend_opcode.c @@ -489,10 +489,15 @@ static void zend_check_finally_breakout(zend_op_array *op_array, zend_uint op_nu zend_uint i; for (i = 0; i < op_array->last_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 + if ((op_num < op_array->try_catch_array[i].finally_op || + op_num >= op_array->try_catch_array[i].finally_end) + && (dst_num >= op_array->try_catch_array[i].finally_op && + dst_num <= op_array->try_catch_array[i].finally_end)) { + CG(in_compilation) = 1; + CG(active_op_array) = op_array; + CG(zend_lineno) = op_array->opcodes[op_num].lineno; + zend_error_noreturn(E_COMPILE_ERROR, "jump into a finally block is disallowed"); + } else if ((op_num >= op_array->try_catch_array[i].finally_op && op_num <= op_array->try_catch_array[i].finally_end) && (dst_num > op_array->try_catch_array[i].finally_end || dst_num < op_array->try_catch_array[i].finally_op)) { @@ -541,11 +546,11 @@ static void zend_resolve_finally_call(zend_op_array *op_array, zend_uint op_num, while (i > 0) { i--; if (op_array->try_catch_array[i].finally_op && - op_num >= op_array->try_catch_array[i].try_op && - op_num < op_array->try_catch_array[i].finally_op - 1 && - (dst_num < op_array->try_catch_array[i].try_op || - dst_num > op_array->try_catch_array[i].finally_end)) { - + op_num >= op_array->try_catch_array[i].try_op && + op_num < op_array->try_catch_array[i].finally_op - 1 && + (dst_num < op_array->try_catch_array[i].try_op || + dst_num > op_array->try_catch_array[i].finally_end)) { + opline = get_next_op(op_array TSRMLS_CC); opline->opcode = ZEND_FAST_CALL; SET_UNUSED(opline->op1); @@ -565,7 +570,7 @@ static void zend_resolve_finally_call(zend_op_array *op_array, zend_uint op_num, SET_UNUSED(opline->op2); opline->op1.opline_num = start_op; - break; + break; } } } |