summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcus Boerger <helly@php.net>2005-01-25 10:40:51 +0000
committerMarcus Boerger <helly@php.net>2005-01-25 10:40:51 +0000
commit82193adc09d7f107fcfedcb544b5a8f76e1dc33f (patch)
tree987bc8a81f98b75b9b8a3f43115917824245ae7e
parent14e54cdc1e438f9149f90f652c0497e82f81497a (diff)
downloadphp-git-82193adc09d7f107fcfedcb544b5a8f76e1dc33f.tar.gz
- Bugfix #26229 (getIterator() segfaults when it returns arrays or scalars)
-rwxr-xr-xZend/tests/bug26229.phpt16
-rwxr-xr-xZend/zend_interfaces.c3
-rw-r--r--Zend/zend_vm_def.h3
-rw-r--r--Zend/zend_vm_execute.h15
4 files changed, 32 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_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)
{
diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h
index 485de2392a..db0dc06569 100644
--- a/Zend/zend_vm_def.h
+++ b/Zend/zend_vm_def.h
@@ -2872,6 +2872,9 @@ ZEND_VM_HANDLER(77, ZEND_FE_RESET, CONST|TMP|VAR|CV, ANY)
} else {
FREE_OP1_IF_VAR();
}
+ 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);
ZEND_VM_NEXT_OPCODE();
}
diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h
index 266f2b6868..b2f075bbe1 100644
--- a/Zend/zend_vm_execute.h
+++ b/Zend/zend_vm_execute.h
@@ -1968,6 +1968,9 @@ static int ZEND_FE_RESET_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
} else {
;
}
+ 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);
ZEND_VM_NEXT_OPCODE();
}
@@ -4384,6 +4387,9 @@ static int ZEND_FE_RESET_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
} else {
;
}
+ 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);
ZEND_VM_NEXT_OPCODE();
}
@@ -7462,6 +7468,9 @@ static int ZEND_FE_RESET_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
} else {
if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
}
+ 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);
ZEND_VM_NEXT_OPCODE();
}
@@ -18238,6 +18247,9 @@ static int ZEND_FE_RESET_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
} else {
;
}
+ 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);
ZEND_VM_NEXT_OPCODE();
}
@@ -30537,6 +30549,9 @@ static int ZEND_FE_RESET_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
} else {
FREE_OP_IF_VAR(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);
ZEND_VM_NEXT_OPCODE();
}