From 82b1e22b5763350d22a1fcd638a648015ca85ca4 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Mon, 13 Jul 2015 13:45:27 +0200 Subject: [PATCH] Preserve return value in zend_vm_call_opcode_handler with global opline/ex registers enabled --- Zend/zend_vm_execute.h | 5 ++++- Zend/zend_vm_gen.php | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index d2ea5a6afe..8419dccbc6 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -49553,7 +49553,10 @@ ZEND_API int zend_vm_call_opcode_handler(zend_execute_data* ex) LOAD_OPLINE(); #if defined(ZEND_VM_FP_GLOBAL_REG) && defined(ZEND_VM_IP_GLOBAL_REG) ((opcode_handler_t)OPLINE->handler)(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); - ret = (opline) ? 0 : -1; + ret = (opline) ? execute_data != ex : -1; + if (ret == 1 && execute_data->prev_execute_data != ex) { + ret = 2;; + } #else ret = ((opcode_handler_t)OPLINE->handler)(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); #endif diff --git a/Zend/zend_vm_gen.php b/Zend/zend_vm_gen.php index 36c4a32f5c..ce4a32185f 100644 --- a/Zend/zend_vm_gen.php +++ b/Zend/zend_vm_gen.php @@ -1606,7 +1606,10 @@ function gen_vm($def, $skel) { out($f, "\tLOAD_OPLINE();\n"); out($f,"#if defined(ZEND_VM_FP_GLOBAL_REG) && defined(ZEND_VM_IP_GLOBAL_REG)\n"); out($f, "\t((opcode_handler_t)OPLINE->handler)(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);\n"); - out($f, "\tret = (opline) ? 0 : -1;\n"); + out($f, "\tret = (opline) ? execute_data != ex : -1;\n"); + out($f, "\tif (ret == 1 && execute_data->prev_execute_data != ex) {\n"); + out($f, "\t\tret = 2;;\n"); + out($f, "\t}\n"); out($f, "#else\n"); out($f, "\tret = ((opcode_handler_t)OPLINE->handler)(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);\n"); out($f, "#endif\n"); -- 2.50.1