Module: wine Branch: master Commit: 1a9ddc37590664b8710c19d487f92f86ded34dfe URL: https://source.winehq.org/git/wine.git/?a=commit;h=1a9ddc37590664b8710c19d48...
Author: Alexandre Julliard julliard@winehq.org Date: Mon Mar 9 15:14:44 2020 +0100
kernelbase: Don't use towlower() on the full Unicode character range.
Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/kernelbase/path.c | 17 +++++++---------- dlls/kernelbase/string.c | 8 +++++--- 2 files changed, 12 insertions(+), 13 deletions(-)
diff --git a/dlls/kernelbase/path.c b/dlls/kernelbase/path.c index 93446815f2..0e0c3f3dbd 100644 --- a/dlls/kernelbase/path.c +++ b/dlls/kernelbase/path.c @@ -1652,7 +1652,7 @@ int WINAPI PathCommonPrefixW(const WCHAR *file1, const WCHAR *file2, WCHAR *path if ((!*iter1 || *iter1 == '\') && (!*iter2 || *iter2 == '\')) len = iter1 - file1; /* Common to this point */
- if (!*iter1 || (towlower(*iter1) != towlower(*iter2))) + if (!*iter1 || (towupper(*iter1) != towupper(*iter2))) break; /* Strings differ at this point */
iter1++; @@ -1813,8 +1813,6 @@ int WINAPI PathGetDriveNumberA(const char *path)
int WINAPI PathGetDriveNumberW(const WCHAR *path) { - WCHAR drive; - TRACE("%s\n", wine_dbgstr_w(path));
if (!path) @@ -1822,11 +1820,10 @@ int WINAPI PathGetDriveNumberW(const WCHAR *path)
if (!wcsncmp(path, L"\\?\", 4)) path += 4;
- drive = towlower(path[0]); - if (drive < 'a' || drive > 'z' || path[1] != ':') - return -1; - - return drive - 'a'; + if (!path[0] || path[1] != ':') return -1; + if (path[0] >= 'A' && path[0] <= 'Z') return path[0] - 'A'; + if (path[0] >= 'a' && path[0] <= 'z') return path[0] - 'a'; + return -1; }
BOOL WINAPI PathIsFileSpecA(const char *path) @@ -4733,7 +4730,7 @@ HRESULT WINAPI UrlCombineW(const WCHAR *baseW, const WCHAR *relativeW, WCHAR *co
work = (LPWSTR)base.pszProtocol; for (i = 0; i < base.cchProtocol; ++i) - work[i] = towlower(work[i]); + work[i] = RtlDowncaseUnicodeChar(work[i]);
/* mk is a special case */ if (base.nScheme == URL_SCHEME_MK) @@ -4871,7 +4868,7 @@ HRESULT WINAPI UrlCombineW(const WCHAR *baseW, const WCHAR *relativeW, WCHAR *co { work = (LPWSTR)relative.pszProtocol; for (i = 0; i < relative.cchProtocol; ++i) - work[i] = towlower(work[i]); + work[i] = RtlDowncaseUnicodeChar(work[i]); }
/* Handle cases where relative has scheme. */ diff --git a/dlls/kernelbase/string.c b/dlls/kernelbase/string.c index 7c484e2858..75ee5b0512 100644 --- a/dlls/kernelbase/string.c +++ b/dlls/kernelbase/string.c @@ -924,7 +924,7 @@ BOOL WINAPI StrToInt64ExW(const WCHAR *str, DWORD flags, LONGLONG *ret) else if (*str == '+') str++;
- if (flags & STIF_SUPPORT_HEX && *str == '0' && towlower(str[1]) == 'x') + if (flags & STIF_SUPPORT_HEX && *str == '0' && (str[1] == 'x' || str[1] == 'X')) { /* Read hex number */ str += 2; @@ -935,10 +935,12 @@ BOOL WINAPI StrToInt64ExW(const WCHAR *str, DWORD flags, LONGLONG *ret) while (iswxdigit(*str)) { value *= 16; - if (iswdigit(*str)) + if (*str >= '0' && *str <= '9') value += (*str - '0'); + else if (*str >= 'A' && *str <= 'Z') + value += 10 + (*str - 'A'); else - value += 10 + (towlower(*str) - 'a'); + value += 10 + (*str - 'a'); str++; }