diff --git a/Zend/tests/gh13279.phpt b/Zend/tests/gh13279.phpt new file mode 100644 index 000000000000..c39f520e57e0 --- /dev/null +++ b/Zend/tests/gh13279.phpt @@ -0,0 +1,18 @@ +--TEST-- +GH-13279: Instable array during in-place modification in uksort +--FILE-- + +===DONE=== +--EXPECT-- +===DONE=== diff --git a/ext/standard/array.c b/ext/standard/array.c index 388b15a0879b..0e99dd8fd5e5 100644 --- a/ext/standard/array.c +++ b/ext/standard/array.c @@ -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);