]> granicus.if.org Git - php/commitdiff
Fix #79986: str_ireplace bug with diacritics characters
authorChristoph M. Becker <cmbecker69@gmx.de>
Tue, 18 Aug 2020 11:24:17 +0000 (13:24 +0200)
committerChristoph M. Becker <cmbecker69@gmx.de>
Mon, 24 Aug 2020 09:08:48 +0000 (11:08 +0200)
`tolower()` returns an `int`, so we must not convert to `char` which
may be `signed` and as such may be subject to overflow (actually,
implementation defined behavior).

Closes GH-6007

NEWS
ext/standard/string.c
ext/standard/tests/strings/bug79986.phpt [new file with mode: 0644]

diff --git a/NEWS b/NEWS
index 2dfd4e2fcb78f2578db62551d869be46ea2e7c53..9666878056632095d609b7c7347685a95d2baa61 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -10,6 +10,9 @@ PHP                                                                        NEWS
   . Fixed bug #80002 (calc free space for new interned string is wrong).
     (t-matsuno)
 
+- Standard:
+  . Fixed bug #79986 (str_ireplace bug with diacritics characters). (cmb)
+
 03 Sep 2020, PHP 7.3.22
 
 - Core:
index b070a5e827fd5cfd2e0bdb98a18cae4ee1f8d721..e4361a111460f9d42e16ea11ed4f7052129f30e4 100644 (file)
@@ -3156,7 +3156,7 @@ static zend_string* php_char_to_str_ex(zend_string *str, char from, char *to, si
 {
        zend_string *result;
        size_t char_count = 0;
-       char lc_from = 0;
+       int lc_from = 0;
        const char *source, *source_end= ZSTR_VAL(str) + ZSTR_LEN(str);
        char *target;
 
diff --git a/ext/standard/tests/strings/bug79986.phpt b/ext/standard/tests/strings/bug79986.phpt
new file mode 100644 (file)
index 0000000..fcbc721
--- /dev/null
@@ -0,0 +1,13 @@
+--TEST--
+Bug #79986 (str_ireplace bug with diacritics characters)
+--SKIPIF--
+<?php
+if (!setlocale(LC_ALL, 'de_DE.ISO-8859-1', 'de-DE')) die('skip German locale not available');
+?>
+--FILE--
+<?php
+setlocale(LC_ALL, 'de_DE.ISO-8859-1', 'de-DE');
+echo str_ireplace(["\xE4", "\xF6", "\xFC"], ['1', '2', '3'], "\xE4\xC4 \xF6\xD6 \xFC\xDC") . PHP_EOL;
+?>
+--EXPECT--
+11 22 33