diff options
author | Nikita Popov <nikic@php.net> | 2015-06-20 19:09:07 +0200 |
---|---|---|
committer | Nikita Popov <nikic@php.net> | 2015-06-20 19:09:25 +0200 |
commit | f58ebb36094e6c59d4e87bfba2a0504858adbec9 (patch) | |
tree | ffa777ecce60c6cc5c9941c53922e758cdaa3443 | |
parent | ffe0f470d6e6193a780c1b8cb425cb52c0400a87 (diff) | |
download | php-git-f58ebb36094e6c59d4e87bfba2a0504858adbec9.tar.gz |
Load/restore VM stack before unfinished generator cleanup
-rw-r--r-- | Zend/zend_generators.c | 18 |
1 files changed, 17 insertions, 1 deletions
diff --git a/Zend/zend_generators.c b/Zend/zend_generators.c index fea3a2f50e..6a04ebd123 100644 --- a/Zend/zend_generators.c +++ b/Zend/zend_generators.c @@ -42,7 +42,23 @@ static void zend_generator_cleanup_unfinished_execution(zend_generator *generato generator->send_target = NULL; } - zend_cleanup_unfinished_execution(execute_data, op_num, 0); + { + /* There may be calls to zend_vm_stack_free_call_frame(), which modifies the VM stack + * globals, so need to load/restore those. */ + zend_vm_stack original_stack = EG(vm_stack); + original_stack->top = EG(vm_stack_top); + EG(vm_stack_top) = generator->stack->top; + EG(vm_stack_end) = generator->stack->end; + EG(vm_stack) = generator->stack; + + zend_cleanup_unfinished_execution(execute_data, op_num, 0); + + generator->stack = EG(vm_stack); + generator->stack->top = EG(vm_stack_top); + EG(vm_stack_top) = original_stack->top; + EG(vm_stack_end) = original_stack->end; + EG(vm_stack) = original_stack; + } } /* }}} */ |