]> granicus.if.org Git - php/commitdiff
Preserve return value in zend_vm_call_opcode_handler with global opline/ex registers...
authorBob Weinand <bobwei9@hotmail.com>
Mon, 13 Jul 2015 11:45:27 +0000 (13:45 +0200)
committerBob Weinand <bobwei9@hotmail.com>
Mon, 13 Jul 2015 12:12:45 +0000 (14:12 +0200)
Zend/zend_vm_execute.h
Zend/zend_vm_gen.php

index d2ea5a6afe376474b966e5e9f882c9b9f55bf177..8419dccbc64f659ba993fc5738062d4e0cca563e 100644 (file)
@@ -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
index 36c4a32f5ce9290f4db874b1c4196c6db5fabab1..ce4a32185f2f0af9c190fb0544e078665ca3891e 100644 (file)
@@ -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");