]> granicus.if.org Git - php/commitdiff
Fix bug #52238: Crash when an Exception occured in iterator_to_array
authorJohannes Schlüter <johannes@php.net>
Fri, 2 Jul 2010 19:17:45 +0000 (19:17 +0000)
committerJohannes Schlüter <johannes@php.net>
Fri, 2 Jul 2010 19:17:45 +0000 (19:17 +0000)
ext/spl/spl_iterators.c
ext/spl/tests/bug52238.phpt [new file with mode: 0644]

index c8d0e64461c05631cf381c19f19b3243faa36842..95188b73d6bce5411f619d41340b40a879dd16d9 100755 (executable)
@@ -3033,7 +3033,9 @@ PHPAPI int spl_iterator_apply(zval *obj, spl_iterator_apply_func_t apply_func, v
        }
 
 done:
-       iter->funcs->dtor(iter TSRMLS_CC);
+       if (iter) {
+               iter->funcs->dtor(iter TSRMLS_CC);
+       }
        return EG(exception) ? FAILURE : SUCCESS;
 }
 /* }}} */
diff --git a/ext/spl/tests/bug52238.phpt b/ext/spl/tests/bug52238.phpt
new file mode 100644 (file)
index 0000000..85410bd
--- /dev/null
@@ -0,0 +1,24 @@
+--TEST--
+Bug #52238 - Crash when an Exception occured in iterator_to_array
+--FILE--
+<?php
+class Foo implements IteratorAggregate
+{
+    public function bar() {
+        throw new Exception;
+    }
+                                               
+    public function getIterator() {
+        return new ArrayIterator($this->bar());
+    }
+}
+var_dump(iterator_to_array(new Foo));
+?>
+--EXPECTF--
+Fatal error: Uncaught exception 'Exception' in %s
+Stack trace:
+#0 %s: Foo->bar()
+#1 [internal function]: Foo->getIterator()
+#2 %s: iterator_to_array(Object(Foo))
+#3 {main}
+  thrown in %s on line %d