1
0
mirror of https://github.com/php/php-src.git synced 2026-03-24 00:02:20 +01:00

Merge branch 'PHP-8.3'

* PHP-8.3:
  Fix instable array during in-place modification in uksort
This commit is contained in:
Ilija Tovilo
2024-01-31 19:25:59 +01:00
2 changed files with 20 additions and 10 deletions

View File

@@ -901,19 +901,11 @@ static void php_usort(INTERNAL_FUNCTION_PARAMETERS, bucket_compare_func_t compar
RETURN_TRUE;
}
/* Copy array, so the in-place modifications will not be visible to the callback function.
* Unless there are no other references since we know for sure it won't be visible. */
bool in_place = zend_may_modify_arg_in_place(array);
if (!in_place) {
arr = zend_array_dup(arr);
}
/* Copy array, so the in-place modifications will not be visible to the callback function */
arr = zend_array_dup(arr);
zend_hash_sort(arr, compare_func, renumber);
if (in_place) {
GC_ADDREF(arr);
}
zval garbage;
ZVAL_COPY_VALUE(&garbage, array);
ZVAL_ARR(array, arr);

View File

@@ -0,0 +1,18 @@
--TEST--
GH-13279: Instable array during in-place modification in uksort
--FILE--
<?php
// Make sure the array is not const
$array = [];
$array['a'] = 1;
$array['b'] = 2;
uksort($array, function ($a, $b) use (&$array) {
return $array[$a] - $array[$b];
});
?>
===DONE===
--EXPECT--
===DONE===