summaryrefslogtreecommitdiff
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
parent7215261349290ae168e7c1e351d3c655d34b6a0b (diff)
parentc34c5234678a5898c1796983e9ca8faa293f3fe3 (diff)
downloadphp-git-226395a335c2783085a49d5a8559807a3b14e72f.tar.gz
Merge branch 'PHP-7.4' into PHP-8.0
* PHP-7.4: Fixed bug #80719
-rw-r--r--NEWS4
-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
5 files changed, 31 insertions, 8 deletions
diff --git a/NEWS b/NEWS
index e5490a357a..4dc17f36c5 100644
--- a/NEWS
+++ b/NEWS
@@ -23,6 +23,10 @@ PHP NEWS
. Fixed bug #70091 (Phar does not mark UTF-8 filenames in ZIP archives). (cmb)
. Fixed bug #53467 (Phar cannot compress large archives). (cmb, lserni)
+- SPL:
+ . Fixed bug#80719 (Iterating after failed ArrayObject::setIteratorClass()
+ causes Segmentation fault). (Nikita)
+
- Standard:
. Fixed bug #80654 (file_get_contents() maxlen fails above (2**31)-1 bytes).
(cmb)
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)