com php-src: Load/restore VM stack before unfinished generator cleanup: Zend/zend_generators.c
| From: | Nikita Popov | Date: | Sat, 20 Jun 2015 17:09:25 +0000 |
| Subject: | com php-src: Load/restore VM stack before unfinished generator cleanup: Zend/zend_generators.c | ||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-87416@lists.php.net to get a copy of this message | ||
Commit: f58ebb36094e6c59d4e87bfba2a0504858adbec9
Author: Nikita Popov <nikic@php.net> Sat, 20 Jun 2015 19:09:07 +0200
Parents: ffe0f470d6e6193a780c1b8cb425cb52c0400a87
Branches: master
Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=f58ebb36094e6c59d4e87bfba2a0504858adbec9
Log:
Load/restore VM stack before unfinished generator cleanup
Changed paths:
M Zend/zend_generators.c
Diff:
diff --git a/Zend/zend_generators.c b/Zend/zend_generators.c
index fea3a2f..6a04ebd 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;
+ }
}
/* }}} */