summaryrefslogtreecommitdiff
path: root/Zend/zend_opcode.c
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2013-12-13 11:17:50 +0400
committerDmitry Stogov <dmitry@zend.com>2013-12-13 11:17:50 +0400
commitaf66b207816e29bd7e8e8798ef438cfe53b5521e (patch)
treec4de5c79d384242a8b3bbed81d028054e42154ac /Zend/zend_opcode.c
parent3bddcc13b5c9f6aa0cf6113b8009c621b7867fd5 (diff)
parent6f95a07c411fa78092427c6edd2d867d0f085b73 (diff)
downloadphp-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.c25
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;
}
}
}