]> granicus.if.org Git - php/commitdiff
Safe exit from executor()
authorDmitry Stogov <dmitry@php.net>
Wed, 21 Nov 2007 12:28:30 +0000 (12:28 +0000)
committerDmitry Stogov <dmitry@php.net>
Wed, 21 Nov 2007 12:28:30 +0000 (12:28 +0000)
Zend/zend_execute.c
Zend/zend_vm_def.h
Zend/zend_vm_execute.h

index d7914f7209eef767884274ec160a2164e44f7db3..69bf58fca67d21f93343ce7148877d7d664f09af 100644 (file)
@@ -1446,7 +1446,7 @@ ZEND_API void execute_internal(zend_execute_data *execute_data_ptr, int return_v
                EX(opline)++; \
        }
 
-#define ZEND_VM_RETURN_FROM_EXECUTE_LOOP() \
+#define ZEND_VM_EXIT_FROM_EXECUTE_LOOP() \
        free_alloca(EX(CVs)); \
        if (EX(op_array)->T < TEMP_VAR_STACK_LIMIT) { \
                free_alloca(EX(Ts)); \
@@ -1455,7 +1455,10 @@ ZEND_API void execute_internal(zend_execute_data *execute_data_ptr, int return_v
        } \
        EG(in_execution) = EX(original_in_execution); \
        EG(current_execute_data) = EX(prev_execute_data); \
-       EG(opline_ptr) = NULL; \
+       EG(opline_ptr) = NULL;
+
+#define ZEND_VM_RETURN_FROM_EXECUTE_LOOP() \
+       ZEND_VM_EXIT_FROM_EXECUTE_LOOP(); \
        ZEND_VM_RETURN()
 
 #include "zend_vm_execute.h"
index 386a1e65a1554030ab2abb0b0db02b65573e1408..7227a8fc46eaddffe4f93875e3fd4bb2f07c4462 100644 (file)
@@ -3885,6 +3885,7 @@ ZEND_VM_HANDLER(79, ZEND_EXIT, CONST|TMP|VAR|UNUSED|CV, ANY)
                FREE_OP1();
        }
 #endif
+       ZEND_VM_EXIT_FROM_EXECUTE_LOOP();
        zend_bailout();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -4159,7 +4160,7 @@ ZEND_VM_HANDLER(150, ZEND_USER_OPCODE, ANY, ANY)
                case ZEND_USER_OPCODE_CONTINUE:
                        ZEND_VM_CONTINUE();
                case ZEND_USER_OPCODE_RETURN:
-                       ZEND_VM_RETURN();
+                       ZEND_VM_RETURN_FROM_EXECUTE_LOOP();
                case ZEND_USER_OPCODE_DISPATCH:
                        ZEND_VM_DISPATCH(EX(opline)->opcode, EX(opline));
                default:
index 7c93532c8fccfdfc55c73f74304abf977755a5b5..02952a257c5e5134bab7f00e1b09d3be8805fe9d 100644 (file)
@@ -615,7 +615,7 @@ static int ZEND_USER_OPCODE_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
                case ZEND_USER_OPCODE_CONTINUE:
                        ZEND_VM_CONTINUE();
                case ZEND_USER_OPCODE_RETURN:
-                       ZEND_VM_RETURN();
+                       ZEND_VM_RETURN_FROM_EXECUTE_LOOP();
                case ZEND_USER_OPCODE_DISPATCH:
                        ZEND_VM_DISPATCH(EX(opline)->opcode, EX(opline));
                default:
@@ -2194,6 +2194,7 @@ static int ZEND_EXIT_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 
        }
 #endif
+       ZEND_VM_EXIT_FROM_EXECUTE_LOOP();
        zend_bailout();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -5402,6 +5403,7 @@ static int ZEND_EXIT_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
                zval_dtor(free_op1.var);
        }
 #endif
+       ZEND_VM_EXIT_FROM_EXECUTE_LOOP();
        zend_bailout();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -8854,6 +8856,7 @@ static int ZEND_EXIT_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
                if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
        }
 #endif
+       ZEND_VM_EXIT_FROM_EXECUTE_LOOP();
        zend_bailout();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -16467,6 +16470,7 @@ static int ZEND_EXIT_SPEC_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 
        }
 #endif
+       ZEND_VM_EXIT_FROM_EXECUTE_LOOP();
        zend_bailout();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -22219,6 +22223,7 @@ static int ZEND_EXIT_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 
        }
 #endif
+       ZEND_VM_EXIT_FROM_EXECUTE_LOOP();
        zend_bailout();
        ZEND_VM_NEXT_OPCODE();
 }