Skip to content

Commit 226395a

Browse files
committed
Merge branch 'PHP-7.4' into PHP-8.0
* PHP-7.4: Fixed bug #80719
2 parents 7215261 + c34c523 commit 226395a

File tree

5 files changed

+31
-8
lines changed

5 files changed

+31
-8
lines changed

NEWS

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,10 @@ PHP NEWS
2323
. Fixed bug #70091 (Phar does not mark UTF-8 filenames in ZIP archives). (cmb)
2424
. Fixed bug #53467 (Phar cannot compress large archives). (cmb, lserni)
2525

26+
- SPL:
27+
. Fixed bug#80719 (Iterating after failed ArrayObject::setIteratorClass()
28+
causes Segmentation fault). (Nikita)
29+
2630
- Standard:
2731
. Fixed bug #80654 (file_get_contents() maxlen fails above (2**31)-1 bytes).
2832
(cmb)

ext/spl/spl_array.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1175,7 +1175,7 @@ PHP_METHOD(ArrayObject, __construct)
11751175
spl_array_object *intern;
11761176
zval *array;
11771177
zend_long ar_flags = 0;
1178-
zend_class_entry *ce_get_iterator = spl_ce_Iterator;
1178+
zend_class_entry *ce_get_iterator = spl_ce_ArrayIterator;
11791179

11801180
if (ZEND_NUM_ARGS() == 0) {
11811181
return; /* nothing to do */
@@ -1226,7 +1226,7 @@ PHP_METHOD(ArrayObject, setIteratorClass)
12261226
{
12271227
zval *object = ZEND_THIS;
12281228
spl_array_object *intern = Z_SPLARRAY_P(object);
1229-
zend_class_entry * ce_get_iterator = spl_ce_Iterator;
1229+
zend_class_entry *ce_get_iterator = spl_ce_ArrayIterator;
12301230

12311231
ZEND_PARSE_PARAMETERS_START(1, 1)
12321232
Z_PARAM_CLASS(ce_get_iterator)

ext/spl/tests/arrayObject___construct_error1.phpt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,6 @@ try {
2020
?>
2121
--EXPECT--
2222
Bad iterator type:
23-
ArrayObject::__construct(): Argument #3 ($iteratorClass) must be a class name derived from Iterator, Exception given(6)
23+
ArrayObject::__construct(): Argument #3 ($iteratorClass) must be a class name derived from ArrayIterator, Exception given(6)
2424
Non-existent class:
25-
ArrayObject::__construct(): Argument #3 ($iteratorClass) must be a class name derived from Iterator, nonExistentClassName given(13)
25+
ArrayObject::__construct(): Argument #3 ($iteratorClass) must be a class name derived from ArrayIterator, nonExistentClassName given(13)

ext/spl/tests/arrayObject_setIteratorClass_error1.phpt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ try {
4343

4444
?>
4545
--EXPECT--
46-
string(128) "ArrayObject::setIteratorClass(): Argument #1 ($iteratorClass) must be a class name derived from Iterator, nonExistentClass given"
47-
string(120) "ArrayObject::setIteratorClass(): Argument #1 ($iteratorClass) must be a class name derived from Iterator, stdClass given"
48-
string(123) "ArrayObject::__construct(): Argument #3 ($iteratorClass) must be a class name derived from Iterator, nonExistentClass given"
49-
string(115) "ArrayObject::__construct(): Argument #3 ($iteratorClass) must be a class name derived from Iterator, stdClass given"
46+
string(133) "ArrayObject::setIteratorClass(): Argument #1 ($iteratorClass) must be a class name derived from ArrayIterator, nonExistentClass given"
47+
string(125) "ArrayObject::setIteratorClass(): Argument #1 ($iteratorClass) must be a class name derived from ArrayIterator, stdClass given"
48+
string(128) "ArrayObject::__construct(): Argument #3 ($iteratorClass) must be a class name derived from ArrayIterator, nonExistentClass given"
49+
string(120) "ArrayObject::__construct(): Argument #3 ($iteratorClass) must be a class name derived from ArrayIterator, stdClass given"

ext/spl/tests/bug80719.phpt

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
--TEST--
2+
Bug #80719: Iterating after failed ArrayObject::setIteratorClass() causes Segmentation fault
3+
--FILE--
4+
<?php
5+
6+
$array = new ArrayObject([42]);
7+
try {
8+
$array->setIteratorClass(FilterIterator::class);
9+
} catch (TypeError $e) {
10+
echo $e->getMessage(), "\n";
11+
}
12+
foreach ($array as $v) {
13+
var_dump($v);
14+
}
15+
16+
?>
17+
--EXPECT--
18+
ArrayObject::setIteratorClass(): Argument #1 ($iteratorClass) must be a class name derived from ArrayIterator, FilterIterator given
19+
int(42)

0 commit comments

Comments
 (0)