diff options
author | Nikita Popov <nikita.ppv@gmail.com> | 2018-01-12 22:48:29 +0100 |
---|---|---|
committer | Nikita Popov <nikita.ppv@gmail.com> | 2018-01-12 22:51:03 +0100 |
commit | cab0a814bdbfc653754f74b42056c38bdf4fbadb (patch) | |
tree | 3e45bf21480179808106d99773857d32e5b046f8 | |
parent | 420d11e8caf8dc76e08984dfed3a4322295a1208 (diff) | |
download | php-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.c | 6 |
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) /* {{{ */ |