Safe exit from executor()

This commit is contained in:
Dmitry Stogov 2007-11-21 12:28:30 +00:00
parent d4664800ac
commit 21f68908b9
3 changed files with 13 additions and 4 deletions

View File

@ -1446,7 +1446,7 @@ ZEND_API void execute_internal(zend_execute_data *execute_data_ptr, int return_v
EX(opline)++; \ EX(opline)++; \
} }
#define ZEND_VM_RETURN_FROM_EXECUTE_LOOP() \ #define ZEND_VM_EXIT_FROM_EXECUTE_LOOP() \
free_alloca(EX(CVs)); \ free_alloca(EX(CVs)); \
if (EX(op_array)->T < TEMP_VAR_STACK_LIMIT) { \ if (EX(op_array)->T < TEMP_VAR_STACK_LIMIT) { \
free_alloca(EX(Ts)); \ 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(in_execution) = EX(original_in_execution); \
EG(current_execute_data) = EX(prev_execute_data); \ 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() ZEND_VM_RETURN()
#include "zend_vm_execute.h" #include "zend_vm_execute.h"

View File

@ -3885,6 +3885,7 @@ ZEND_VM_HANDLER(79, ZEND_EXIT, CONST|TMP|VAR|UNUSED|CV, ANY)
FREE_OP1(); FREE_OP1();
} }
#endif #endif
ZEND_VM_EXIT_FROM_EXECUTE_LOOP();
zend_bailout(); zend_bailout();
ZEND_VM_NEXT_OPCODE(); ZEND_VM_NEXT_OPCODE();
} }
@ -4159,7 +4160,7 @@ ZEND_VM_HANDLER(150, ZEND_USER_OPCODE, ANY, ANY)
case ZEND_USER_OPCODE_CONTINUE: case ZEND_USER_OPCODE_CONTINUE:
ZEND_VM_CONTINUE(); ZEND_VM_CONTINUE();
case ZEND_USER_OPCODE_RETURN: case ZEND_USER_OPCODE_RETURN:
ZEND_VM_RETURN(); ZEND_VM_RETURN_FROM_EXECUTE_LOOP();
case ZEND_USER_OPCODE_DISPATCH: case ZEND_USER_OPCODE_DISPATCH:
ZEND_VM_DISPATCH(EX(opline)->opcode, EX(opline)); ZEND_VM_DISPATCH(EX(opline)->opcode, EX(opline));
default: default:

View File

@ -615,7 +615,7 @@ static int ZEND_USER_OPCODE_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
case ZEND_USER_OPCODE_CONTINUE: case ZEND_USER_OPCODE_CONTINUE:
ZEND_VM_CONTINUE(); ZEND_VM_CONTINUE();
case ZEND_USER_OPCODE_RETURN: case ZEND_USER_OPCODE_RETURN:
ZEND_VM_RETURN(); ZEND_VM_RETURN_FROM_EXECUTE_LOOP();
case ZEND_USER_OPCODE_DISPATCH: case ZEND_USER_OPCODE_DISPATCH:
ZEND_VM_DISPATCH(EX(opline)->opcode, EX(opline)); ZEND_VM_DISPATCH(EX(opline)->opcode, EX(opline));
default: default:
@ -2194,6 +2194,7 @@ static int ZEND_EXIT_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
} }
#endif #endif
ZEND_VM_EXIT_FROM_EXECUTE_LOOP();
zend_bailout(); zend_bailout();
ZEND_VM_NEXT_OPCODE(); ZEND_VM_NEXT_OPCODE();
} }
@ -5402,6 +5403,7 @@ static int ZEND_EXIT_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
zval_dtor(free_op1.var); zval_dtor(free_op1.var);
} }
#endif #endif
ZEND_VM_EXIT_FROM_EXECUTE_LOOP();
zend_bailout(); zend_bailout();
ZEND_VM_NEXT_OPCODE(); 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);}; if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
} }
#endif #endif
ZEND_VM_EXIT_FROM_EXECUTE_LOOP();
zend_bailout(); zend_bailout();
ZEND_VM_NEXT_OPCODE(); ZEND_VM_NEXT_OPCODE();
} }
@ -16467,6 +16470,7 @@ static int ZEND_EXIT_SPEC_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
} }
#endif #endif
ZEND_VM_EXIT_FROM_EXECUTE_LOOP();
zend_bailout(); zend_bailout();
ZEND_VM_NEXT_OPCODE(); ZEND_VM_NEXT_OPCODE();
} }
@ -22219,6 +22223,7 @@ static int ZEND_EXIT_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
} }
#endif #endif
ZEND_VM_EXIT_FROM_EXECUTE_LOOP();
zend_bailout(); zend_bailout();
ZEND_VM_NEXT_OPCODE(); ZEND_VM_NEXT_OPCODE();
} }