diff options
author | Bob Weinand <bobwei9@hotmail.com> | 2015-07-13 13:45:27 +0200 |
---|---|---|
committer | Bob Weinand <bobwei9@hotmail.com> | 2015-07-13 13:45:27 +0200 |
commit | 79e6dba040e596fd9f223728c8ffc18d4457b11e (patch) | |
tree | db9b41f162c778f056cd55894256855865347bf0 | |
parent | a49ce7bb91bec02d6f26b3118404371df23242fe (diff) | |
download | php-git-79e6dba040e596fd9f223728c8ffc18d4457b11e.tar.gz |
Preserve return value in zend_vm_call_opcode_handler with global opline/ex registers enabled
-rw-r--r-- | Zend/zend_vm_execute.h | 5 | ||||
-rw-r--r-- | 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 95c1b5dfaa..d43a380d2e 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -49565,7 +49565,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 250b2467e0..d77c54e73e 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"); |