From cab0a814bdbfc653754f74b42056c38bdf4fbadb Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 12 Jan 2018 22:48:29 +0100 Subject: Try to fix yield from GC issues Make sure we always update root and parent references before releasing the old root object. This fixes some crashes under aggressive cycle collection, so hopefully this will also fix bug #75351. --- Zend/zend_generators.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Zend/zend_generators.c b/Zend/zend_generators.c index 69fa17f74f..a932f405e2 100644 --- a/Zend/zend_generators.c +++ b/Zend/zend_generators.c @@ -179,10 +179,11 @@ static void zend_generator_dtor_storage(zend_object *object) /* {{{ */ zend_generator *root = generator->node.ptr.root, *next; while (UNEXPECTED(root != generator)) { next = zend_generator_get_child(&root->node, generator); + generator->node.ptr.root = next; + next->node.parent = NULL; OBJ_RELEASE(&root->std); root = next; } - generator->node.parent = NULL; } if (EXPECTED(!ex) || EXPECTED(!(ex->func->op_array.fn_flags & ZEND_ACC_HAS_FINALLY_BLOCK)) @@ -664,11 +665,12 @@ ZEND_API zend_generator *zend_generator_update_current(zend_generator *generator } } + leaf->node.ptr.root = root; if (old_root) { OBJ_RELEASE(&old_root->std); } - return leaf->node.ptr.root = root; + return root; } static int zend_generator_get_next_delegated_value(zend_generator *generator) /* {{{ */ -- cgit v1.2.1