- MFH #26229 (getIterator() segfaults when it returns arrays or scalars)
authorMarcus Boerger <helly@php.net>
Tue, 25 Jan 2005 10:44:28 +0000 (10:44 +0000)
committerMarcus Boerger <helly@php.net>
Tue, 25 Jan 2005 10:44:28 +0000 (10:44 +0000)
Zend/tests/bug26229.phpt
Zend/zend_execute.c
Zend/zend_interfaces.c

index 1e03bb2c4953cef45ced5431e71af8f3b931359a..347eb555715872af1ad0bb7e5562f8b9024bebdc 100755 (executable)
@@ -11,11 +11,19 @@ class array_iterator implements IteratorAggregate {
 
 $obj = new array_iterator;
 
-foreach ($obj as $property => $value) {
-        var_dump($value);
+try
+{
+       foreach ($obj as $property => $value)
+       {
+               var_dump($value);
+       }
+}
+catch(Exception $e)
+{
+       echo $e->getMessage() . "\n";
 }
 ?>
 ===DONE===
 --EXPECTF--
-Warning: Objects returned by array_iterator::getIterator() must be traversable or implement interface Iterator in %sbug26229.php on line %d
-===DONE===
\ No newline at end of file
+Objects returned by array_iterator::getIterator() must be traversable or implement interface Iterator
+===DONE===
index 24347bfd8ebadee7390e415f78b5d3bda64c4507..6bacfe8eaa2175fc46d5d9e21853af1ac1cdca4b 100644 (file)
@@ -3752,6 +3752,9 @@ int zend_fe_reset_handler(ZEND_OPCODE_HANDLER_ARGS)
                } else {
                        zval_ptr_dtor(&array_ptr);
                        FREE_OP(Ts, op1, EG(free_op1));
+                       if (!EG(exception)) {
+                               zend_throw_exception_ex(NULL, 0 TSRMLS_CC, "Object of type %s did not create an Iterator", ce->name);
+                       }
                        zend_throw_exception_internal(NULL TSRMLS_CC);
                        NEXT_OPCODE();
                        return 0;
index 9905e258619eb9c6e742edd756b040f705671e34..a6658133e416775c2ce16feba833e5d20f2a046a 100755 (executable)
@@ -21,6 +21,7 @@
 #include "zend.h"
 #include "zend_API.h"
 #include "zend_interfaces.h"
+#include "zend_exceptions.h"
 
 ZEND_API zend_class_entry *zend_ce_traversable;
 ZEND_API zend_class_entry *zend_ce_aggregate;
@@ -275,7 +276,7 @@ static zend_object_iterator *zend_user_it_get_new_iterator(zend_class_entry *ce,
        if (!ce || !ce_it || !ce_it->get_iterator || (ce_it->get_iterator == zend_user_it_get_new_iterator && iterator == object)) {
                if (!EG(exception))
                {
-                       zend_error(E_WARNING, "Objects returned by %s::getIterator() must be traversable or implement interface Iterator", ce->name);
+                       zend_throw_exception_ex(NULL, 0 TSRMLS_CC, "Objects returned by %s::getIterator() must be traversable or implement interface Iterator", ce->name);
                }
                if (iterator)
                {