Skip to content

Instantly share code, notes, and snippets.

@adoy
Last active July 26, 2016 19:40
Show Gist options
  • Save adoy/cdfbdf5777fc6fc7102d8acb51fdd101 to your computer and use it in GitHub Desktop.
Save adoy/cdfbdf5777fc6fc7102d8acb51fdd101 to your computer and use it in GitHub Desktop.
diff --git a/ext/spl/spl_iterators.c b/ext/spl/spl_iterators.c
index c6181d9..bb86e76 100644
--- a/ext/spl/spl_iterators.c
+++ b/ext/spl/spl_iterators.c
@@ -1682,7 +1682,7 @@ static inline void spl_dual_it_rewind(spl_dual_it_object *intern TSRMLS_DC)
{
spl_dual_it_free(intern TSRMLS_CC);
intern->current.pos = 0;
- if (intern->inner.iterator->funcs->rewind) {
+ if (intern->inner.iterator && intern->inner.iterator->funcs->rewind) {
intern->inner.iterator->funcs->rewind(intern->inner.iterator TSRMLS_CC);
}
}
diff --git a/ext/spl/tests/bugXXXXX.phpt b/ext/spl/tests/bugXXXXX.phpt
new file mode 100644
index 0000000..5c4a466
--- /dev/null
+++ b/ext/spl/tests/bugXXXXX.phpt
@@ -0,0 +1,21 @@
+--TEST--
+Bug #XXXXX (AppendIterator segfault with closed generator)
+--FILE--
+<?php
+
+function createGenerator() { yield 1; }
+$generator = createGenerator();
+
+$appendIterator = new AppendIterator();
+$appendIterator->append($generator);
+
+iterator_to_array($appendIterator);
+try {
+ iterator_to_array($appendIterator);
+} catch (\Exception $e) {
+ echo $e->getMessage();
+}
+
+?>
+--EXPECT--
+Cannot traverse an already closed generator
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment