diff --git a/NEWS b/NEWS index cb68d41c3332..54bebd00464d 100644 --- a/NEWS +++ b/NEWS @@ -144,6 +144,8 @@ PHP NEWS (Nicolas Grekas) . Fixed bug GH-24373 (serialize() called from a destructor during var_hash destruction reuses the outer var_hash). (David Carlier) + . Fixed bug GH-24552 (Case-insensitive substr_compare(), ksort() and + krsort() are still locale-dependent). (Lazizbek Ergashev, Jon Surrell) - Streams: . Fixed bug GH-24508 (HTTP wrapper leaks the dechunk filter when header diff --git a/ext/standard/array.c b/ext/standard/array.c index 8454e9616c02..82c3f0a7aa6e 100644 --- a/ext/standard/array.c +++ b/ext/standard/array.c @@ -185,7 +185,7 @@ static zend_always_inline int php_array_key_compare_string_case_unstable_i(Bucke s2 = zend_print_long_to_buf(buf2 + sizeof(buf2) - 1, s->h); l2 = buf2 + sizeof(buf2) - 1 - s2; } - return zend_binary_strcasecmp_l(s1, l1, s2, l2); + return zend_binary_strcasecmp(s1, l1, s2, l2); } /* }}} */ diff --git a/ext/standard/string.c b/ext/standard/string.c index 9f8e45af3299..8b0f8ec572bb 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -6352,7 +6352,7 @@ PHP_FUNCTION(substr_compare) if (!cs) { RETURN_LONG(zend_binary_strncmp(ZSTR_VAL(s1) + offset, (ZSTR_LEN(s1) - offset), ZSTR_VAL(s2), ZSTR_LEN(s2), cmp_len)); } else { - RETURN_LONG(zend_binary_strncasecmp_l(ZSTR_VAL(s1) + offset, (ZSTR_LEN(s1) - offset), ZSTR_VAL(s2), ZSTR_LEN(s2), cmp_len)); + RETURN_LONG(zend_binary_strncasecmp(ZSTR_VAL(s1) + offset, (ZSTR_LEN(s1) - offset), ZSTR_VAL(s2), ZSTR_LEN(s2), cmp_len)); } } /* }}} */ diff --git a/ext/standard/tests/strings/gh24552.phpt b/ext/standard/tests/strings/gh24552.phpt new file mode 100644 index 000000000000..97d350e2096e --- /dev/null +++ b/ext/standard/tests/strings/gh24552.phpt @@ -0,0 +1,38 @@ +--TEST-- +GH-24552 (Case-insensitive substr_compare, ksort, krsort are still locale-dependent) +--SKIPIF-- + +--FILE-- + 0, "\xC4" => 0]; +ksort($keys, SORT_STRING | SORT_FLAG_CASE); +var_dump(array_map('bin2hex', array_keys($keys))); + +$keys = ["\xC4" => 0, "\xE4" => 0]; +krsort($keys, SORT_STRING | SORT_FLAG_CASE); +var_dump(array_map('bin2hex', array_keys($keys))); +?> +--EXPECT-- +int(-32) +int(-32) +array(2) { + [0]=> + string(2) "c4" + [1]=> + string(2) "e4" +} +array(2) { + [0]=> + string(2) "e4" + [1]=> + string(2) "c4" +}