summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikita Popov <nikita.ppv@gmail.com>2018-01-12 22:48:29 +0100
committerNikita Popov <nikita.ppv@gmail.com>2018-01-12 22:51:03 +0100
commitcab0a814bdbfc653754f74b42056c38bdf4fbadb (patch)
tree3e45bf21480179808106d99773857d32e5b046f8
parent420d11e8caf8dc76e08984dfed3a4322295a1208 (diff)
downloadphp-git-cab0a814bdbfc653754f74b42056c38bdf4fbadb.tar.gz
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.
-rw-r--r--Zend/zend_generators.c6
1 files 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) /* {{{ */