Skip to content

Commit

Permalink
Merge branch 'PHP-8.3'
Browse files Browse the repository at this point in the history
* PHP-8.3:
  Fix phpGH-15918: Assertion failure in ext/spl/spl_fixedarray.c
  • Loading branch information
nielsdos committed Sep 20, 2024
2 parents 7e6e712 + 9774ced commit 1b171bb
Show file tree
Hide file tree
Showing 4 changed files with 26 additions and 21 deletions.
4 changes: 4 additions & 0 deletions NEWS
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,10 @@ PHP NEWS
. Fixed bug GH-15711 (SoapClient can't convert BackedEnum to scalar value).
(nielsdos)

- SPL:
. Fixed bug GH-15918 (Assertion failure in ext/spl/spl_fixedarray.c).
(nielsdos)

- Standard:
. Add support for backed enums in http_build_query(). (ilutov)

Expand Down
2 changes: 1 addition & 1 deletion ext/spl/spl_array.c
Original file line number Diff line number Diff line change
Expand Up @@ -964,7 +964,7 @@ static void spl_array_set_array(zval *object, spl_array_object *intern, zval *ar
}
} else {
zend_object_get_properties_t handler = Z_OBJ_HANDLER_P(array, get_properties);
if (handler != zend_std_get_properties) {
if (handler != zend_std_get_properties || Z_OBJ_HANDLER_P(array, get_properties_for)) {
zend_throw_exception_ex(spl_ce_InvalidArgumentException, 0,
"Overloaded object of type %s is not compatible with %s",
ZSTR_VAL(Z_OBJCE_P(array)->name), ZSTR_VAL(intern->std.ce->name));
Expand Down
28 changes: 8 additions & 20 deletions ext/spl/tests/ArrayObject_overloaded_SplFixedArray.phpt
Original file line number Diff line number Diff line change
@@ -1,28 +1,16 @@
--TEST--
SplFixedArray properties is compatible with ArrayObject
SplFixedArray properties is incompatible with ArrayObject
--FILE--
<?php
$ao = new ArrayObject([1, 2, 3]);
$fixedArray = new SplFixedArray(1);
$fixedArray[0] = new SplDoublyLinkedList();
$ao->exchangeArray($fixedArray);
$ao[0] = new stdClass();
var_dump($ao);
try {
// See GH-15918: this *should* fail to not break invariants
$ao->exchangeArray($fixedArray);
} catch (InvalidArgumentException $e) {
echo $e->getMessage(), "\n";
}
?>
--EXPECT--
object(ArrayObject)#1 (1) {
["storage":"ArrayObject":private]=>
object(SplFixedArray)#2 (2) {
[0]=>
object(SplDoublyLinkedList)#3 (2) {
["flags":"SplDoublyLinkedList":private]=>
int(0)
["dllist":"SplDoublyLinkedList":private]=>
array(0) {
}
}
["0"]=>
object(stdClass)#4 (0) {
}
}
}
Overloaded object of type SplFixedArray is not compatible with ArrayObject
13 changes: 13 additions & 0 deletions ext/spl/tests/gh15918.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
--TEST--
GH-15918 (Assertion failure in ext/spl/spl_fixedarray.c)
--FILE--
<?php
$foo = new SplFixedArray(5);
try {
$arrayObject = new ArrayObject($foo);
} catch (InvalidArgumentException $e) {
echo $e->getMessage(), "\n";
}
?>
--EXPECT--
Overloaded object of type SplFixedArray is not compatible with ArrayObject

0 comments on commit 1b171bb

Please sign in to comment.