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

index 8f1e0f0e467514fc0f48b248037b5166087b670a..797fbe8446bd8ce3a63916b982bccbe1f792b163 100644 (file)
@@ -1426,7 +1426,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)); \
@@ -1435,7 +1435,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 2597acec069670e1ad9d4a4a664822f24535f3d9..8c33e7d24b400428c16777e466ffc27030066674 100644 (file)
@@ -3705,6 +3705,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();
 }
@@ -3979,7 +3980,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 5d9f3a2cae35541a3c16bb2db6451f887b601cd7..45f879ea16b53b1d01f3a6156818cd10eb33317e 100644 (file)
@@ -607,7 +607,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:
@@ -2097,6 +2097,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();
 }
@@ -5195,6 +5196,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();
 }
@@ -8519,6 +8521,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();
 }
@@ -15836,6 +15839,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();
 }
@@ -21319,6 +21323,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();
 }