summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPierrick Charron <pierrick@php.net>2016-07-26 20:36:34 -0400
committerPierrick Charron <pierrick@php.net>2016-07-26 20:36:34 -0400
commit2597f5d66552051994ed55655107d9c5142f7d34 (patch)
tree28f6656fa1cdea3c2bc0beca555d3bd021f4500c
parent31ed322b0699e188f418a74adeec4c7e4ddd0bae (diff)
parent4c2e1a13be27b0c44ac5c33a6c548a3d5e5faf8c (diff)
downloadphp-git-2597f5d66552051994ed55655107d9c5142f7d34.tar.gz
Merge branch 'PHP-5.6' into PHP-7.0
Conflicts: ext/spl/spl_iterators.c
-rw-r--r--ext/spl/spl_iterators.c2
-rw-r--r--ext/spl/tests/bug72684.phpt21
2 files changed, 22 insertions, 1 deletions
diff --git a/ext/spl/spl_iterators.c b/ext/spl/spl_iterators.c
index 6a0049733f..0977228faa 100644
--- a/ext/spl/spl_iterators.c
+++ b/ext/spl/spl_iterators.c
@@ -1679,7 +1679,7 @@ static inline void spl_dual_it_rewind(spl_dual_it_object *intern)
{
spl_dual_it_free(intern);
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);
}
}
diff --git a/ext/spl/tests/bug72684.phpt b/ext/spl/tests/bug72684.phpt
new file mode 100644
index 0000000000..7a99901f53
--- /dev/null
+++ b/ext/spl/tests/bug72684.phpt
@@ -0,0 +1,21 @@
+--TEST--
+Bug #72684 (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