From 43765f49f7cc6c60dee841799d8eaa8664ef02a4 Mon Sep 17 00:00:00 2001 From: Marcus Boerger Date: Tue, 25 Jan 2005 10:44:28 +0000 Subject: [PATCH] - MFH #26229 (getIterator() segfaults when it returns arrays or scalars) --- Zend/tests/bug26229.phpt | 16 ++++++++++++---- Zend/zend_execute.c | 3 +++ Zend/zend_interfaces.c | 3 ++- 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/Zend/tests/bug26229.phpt b/Zend/tests/bug26229.phpt index 1e03bb2c49..347eb55571 100755 --- a/Zend/tests/bug26229.phpt +++ b/Zend/tests/bug26229.phpt @@ -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=== diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 24347bfd8e..6bacfe8eaa 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -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; diff --git a/Zend/zend_interfaces.c b/Zend/zend_interfaces.c index 9905e25861..a6658133e4 100755 --- a/Zend/zend_interfaces.c +++ b/Zend/zend_interfaces.c @@ -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) { -- 2.50.1