Skip to content

Commit c34c523

Browse files
committed
Fixed bug #80719
1 parent 4f50800 commit c34c523

File tree

5 files changed

+27
-8
lines changed

5 files changed

+27
-8
lines changed

NEWS

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

20+
- SPL:
21+
. Fixed bug#80719 (Iterating after failed ArrayObject::setIteratorClass()
22+
causes Segmentation fault). (Nikita)
23+
2024
- Standard:
2125
. Fixed bug #80654 (file_get_contents() maxlen fails above (2**31)-1 bytes).
2226
(cmb)

ext/spl/spl_array.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1179,7 +1179,7 @@ SPL_METHOD(Array, __construct)
11791179
spl_array_object *intern;
11801180
zval *array;
11811181
zend_long ar_flags = 0;
1182-
zend_class_entry *ce_get_iterator = spl_ce_Iterator;
1182+
zend_class_entry *ce_get_iterator = spl_ce_ArrayIterator;
11831183

11841184
if (ZEND_NUM_ARGS() == 0) {
11851185
return; /* nothing to do */
@@ -1232,7 +1232,7 @@ SPL_METHOD(Array, setIteratorClass)
12321232
{
12331233
zval *object = ZEND_THIS;
12341234
spl_array_object *intern = Z_SPLARRAY_P(object);
1235-
zend_class_entry * ce_get_iterator = spl_ce_Iterator;
1235+
zend_class_entry *ce_get_iterator = spl_ce_ArrayIterator;
12361236

12371237
ZEND_PARSE_PARAMETERS_START(1, 1)
12381238
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() expects parameter 3 to be a class name derived from Iterator, 'Exception' given(6)
23+
ArrayObject::__construct() expects parameter 3 to be a class name derived from ArrayIterator, 'Exception' given(6)
2424
Non-existent class:
25-
ArrayObject::__construct() expects parameter 3 to be a class name derived from Iterator, 'nonExistentClassName' given(13)
25+
ArrayObject::__construct() expects parameter 3 to 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,14 +43,14 @@ try {
4343

4444
?>
4545
--EXPECTF--
46-
Warning: ArrayObject::setIteratorClass() expects parameter 1 to be a class name derived from Iterator, 'nonExistentClass' given in %s on line 4
46+
Warning: ArrayObject::setIteratorClass() expects parameter 1 to be a class name derived from ArrayIterator, 'nonExistentClass' given in %s on line %d
4747
a=>1
4848
b=>2
4949
c=>3
5050

51-
Warning: ArrayObject::setIteratorClass() expects parameter 1 to be a class name derived from Iterator, 'stdClass' given in %s on line 14
51+
Warning: ArrayObject::setIteratorClass() expects parameter 1 to be a class name derived from ArrayIterator, 'stdClass' given in %s on line %d
5252
a=>1
5353
b=>2
5454
c=>3
55-
string(113) "ArrayObject::__construct() expects parameter 3 to be a class name derived from Iterator, 'nonExistentClass' given"
56-
string(105) "ArrayObject::__construct() expects parameter 3 to be a class name derived from Iterator, 'stdClass' given"
55+
string(118) "ArrayObject::__construct() expects parameter 3 to be a class name derived from ArrayIterator, 'nonExistentClass' given"
56+
string(110) "ArrayObject::__construct() expects parameter 3 to be a class name derived from ArrayIterator, 'stdClass' given"

ext/spl/tests/bug80719.phpt

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
--TEST--
2+
Bug #80719: Iterating after failed ArrayObject::setIteratorClass() causes Segmentation fault
3+
--FILE--
4+
<?php
5+
6+
$array = new ArrayObject([42]);
7+
$array->setIteratorClass(FilterIterator::class);
8+
foreach ($array as $v) {
9+
var_dump($v);
10+
}
11+
12+
?>
13+
--EXPECTF--
14+
Warning: ArrayObject::setIteratorClass() expects parameter 1 to be a class name derived from ArrayIterator, 'FilterIterator' given in %s on line %d
15+
int(42)

0 commit comments

Comments
 (0)