Merge branch 'PHP-8.3'

* PHP-8.3:
  Fix GH-15918: Assertion failure in ext/spl/spl_fixedarray.c
This commit is contained in:
Niels Dossche 2024-09-20 17:34:54 +02:00
commit 1b171bb6b4
No known key found for this signature in database
GPG Key ID: B8A8AD166DF0E2E5
4 changed files with 26 additions and 21 deletions

4
NEWS
View File

@ -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)

View File

@ -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));

View File

@ -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();
try {
// See GH-15918: this *should* fail to not break invariants
$ao->exchangeArray($fixedArray);
$ao[0] = new stdClass();
var_dump($ao);
} 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

View File

@ -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