summaryrefslogtreecommitdiff
path: root/ext/spl
diff options
context:
space:
mode:
authorNikita Popov <nikita.ppv@gmail.com>2021-02-11 16:13:56 +0100
committerNikita Popov <nikita.ppv@gmail.com>2021-02-11 16:13:56 +0100
commit226395a335c2783085a49d5a8559807a3b14e72f (patch)
treea51872fb949bd3527eef587e47b4f8d710b049e3 /ext/spl
parent7215261349290ae168e7c1e351d3c655d34b6a0b (diff)
parentc34c5234678a5898c1796983e9ca8faa293f3fe3 (diff)
downloadphp-git-226395a335c2783085a49d5a8559807a3b14e72f.tar.gz
Merge branch 'PHP-7.4' into PHP-8.0
* PHP-7.4: Fixed bug #80719
Diffstat (limited to 'ext/spl')
-rw-r--r--ext/spl/spl_array.c4
-rw-r--r--ext/spl/tests/arrayObject___construct_error1.phpt4
-rw-r--r--ext/spl/tests/arrayObject_setIteratorClass_error1.phpt8
-rw-r--r--ext/spl/tests/bug80719.phpt19
4 files changed, 27 insertions, 8 deletions
diff --git a/ext/spl/spl_array.c b/ext/spl/spl_array.c
index 3942366fa0..20a9d9e3da 100644
--- a/ext/spl/spl_array.c
+++ b/ext/spl/spl_array.c
@@ -1175,7 +1175,7 @@ PHP_METHOD(ArrayObject, __construct)
spl_array_object *intern;
zval *array;
zend_long ar_flags = 0;
- zend_class_entry *ce_get_iterator = spl_ce_Iterator;
+ zend_class_entry *ce_get_iterator = spl_ce_ArrayIterator;
if (ZEND_NUM_ARGS() == 0) {
return; /* nothing to do */
@@ -1226,7 +1226,7 @@ PHP_METHOD(ArrayObject, setIteratorClass)
{
zval *object = ZEND_THIS;
spl_array_object *intern = Z_SPLARRAY_P(object);
- zend_class_entry * ce_get_iterator = spl_ce_Iterator;
+ zend_class_entry *ce_get_iterator = spl_ce_ArrayIterator;
ZEND_PARSE_PARAMETERS_START(1, 1)
Z_PARAM_CLASS(ce_get_iterator)
diff --git a/ext/spl/tests/arrayObject___construct_error1.phpt b/ext/spl/tests/arrayObject___construct_error1.phpt
index 91ef24f37e..a9fbc9d3b0 100644
--- a/ext/spl/tests/arrayObject___construct_error1.phpt
+++ b/ext/spl/tests/arrayObject___construct_error1.phpt
@@ -20,6 +20,6 @@ try {
?>
--EXPECT--
Bad iterator type:
-ArrayObject::__construct(): Argument #3 ($iteratorClass) must be a class name derived from Iterator, Exception given(6)
+ArrayObject::__construct(): Argument #3 ($iteratorClass) must be a class name derived from ArrayIterator, Exception given(6)
Non-existent class:
-ArrayObject::__construct(): Argument #3 ($iteratorClass) must be a class name derived from Iterator, nonExistentClassName given(13)
+ArrayObject::__construct(): Argument #3 ($iteratorClass) must be a class name derived from ArrayIterator, nonExistentClassName given(13)
diff --git a/ext/spl/tests/arrayObject_setIteratorClass_error1.phpt b/ext/spl/tests/arrayObject_setIteratorClass_error1.phpt
index b9ab040a21..9a0e67b605 100644
--- a/ext/spl/tests/arrayObject_setIteratorClass_error1.phpt
+++ b/ext/spl/tests/arrayObject_setIteratorClass_error1.phpt
@@ -43,7 +43,7 @@ try {
?>
--EXPECT--
-string(128) "ArrayObject::setIteratorClass(): Argument #1 ($iteratorClass) must be a class name derived from Iterator, nonExistentClass given"
-string(120) "ArrayObject::setIteratorClass(): Argument #1 ($iteratorClass) must be a class name derived from Iterator, stdClass given"
-string(123) "ArrayObject::__construct(): Argument #3 ($iteratorClass) must be a class name derived from Iterator, nonExistentClass given"
-string(115) "ArrayObject::__construct(): Argument #3 ($iteratorClass) must be a class name derived from Iterator, stdClass given"
+string(133) "ArrayObject::setIteratorClass(): Argument #1 ($iteratorClass) must be a class name derived from ArrayIterator, nonExistentClass given"
+string(125) "ArrayObject::setIteratorClass(): Argument #1 ($iteratorClass) must be a class name derived from ArrayIterator, stdClass given"
+string(128) "ArrayObject::__construct(): Argument #3 ($iteratorClass) must be a class name derived from ArrayIterator, nonExistentClass given"
+string(120) "ArrayObject::__construct(): Argument #3 ($iteratorClass) must be a class name derived from ArrayIterator, stdClass given"
diff --git a/ext/spl/tests/bug80719.phpt b/ext/spl/tests/bug80719.phpt
new file mode 100644
index 0000000000..506b250dae
--- /dev/null
+++ b/ext/spl/tests/bug80719.phpt
@@ -0,0 +1,19 @@
+--TEST--
+Bug #80719: Iterating after failed ArrayObject::setIteratorClass() causes Segmentation fault
+--FILE--
+<?php
+
+$array = new ArrayObject([42]);
+try {
+ $array->setIteratorClass(FilterIterator::class);
+} catch (TypeError $e) {
+ echo $e->getMessage(), "\n";
+}
+foreach ($array as $v) {
+ var_dump($v);
+}
+
+?>
+--EXPECT--
+ArrayObject::setIteratorClass(): Argument #1 ($iteratorClass) must be a class name derived from ArrayIterator, FilterIterator given
+int(42)