Author: jgardou Date: Sat Feb 15 11:30:13 2014 New Revision: 62197
URL: http://svn.reactos.org/svn/reactos?rev=62197&view=rev Log: [KERNEL32] - Sync CompareStringA to wine 1.7.12 .Fix pollution of LastError by CompareStringA in case of zero-length string. CORE-7911 #comment committed r62197. #resolve
Modified: trunk/reactos/dll/win32/kernel32/winnls/string/lang.c
Modified: trunk/reactos/dll/win32/kernel32/winnls/string/lang.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/kernel32/winnls/s... ============================================================================== --- trunk/reactos/dll/win32/kernel32/winnls/string/lang.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/kernel32/winnls/string/lang.c [iso-8859-1] Sat Feb 15 11:30:13 2014 @@ -1767,13 +1767,13 @@ * str1 is less than, equal to or greater than str2 respectively. * Failure: FALSE. Use GetLastError() to determine the cause. */ -INT WINAPI CompareStringA(LCID lcid, DWORD style, +INT WINAPI CompareStringA(LCID lcid, DWORD flags, LPCSTR str1, INT len1, LPCSTR str2, INT len2) { WCHAR *buf1W = NtCurrentTeb()->StaticUnicodeBuffer; WCHAR *buf2W = buf1W + 130; LPWSTR str1W, str2W; - INT len1W, len2W, ret; + INT len1W = 0, len2W = 0, ret; UINT locale_cp = CP_ACP;
if (!str1 || !str2) @@ -1784,39 +1784,56 @@ if (len1 < 0) len1 = strlen(str1); if (len2 < 0) len2 = strlen(str2);
- if (!(style & LOCALE_USE_CP_ACP)) locale_cp = get_lcid_codepage( lcid ); - - len1W = MultiByteToWideChar(locale_cp, 0, str1, len1, buf1W, 130); - if (len1W) + if (!(flags & LOCALE_USE_CP_ACP)) locale_cp = get_lcid_codepage( lcid ); + + if (len1) + { + if (len1 <= 130) len1W = MultiByteToWideChar(locale_cp, 0, str1, len1, buf1W, 130); + if (len1W) + str1W = buf1W; + else + { + len1W = MultiByteToWideChar(locale_cp, 0, str1, len1, NULL, 0); + str1W = HeapAlloc(GetProcessHeap(), 0, len1W * sizeof(WCHAR)); + if (!str1W) + { + SetLastError(ERROR_NOT_ENOUGH_MEMORY); + return 0; + } + MultiByteToWideChar(locale_cp, 0, str1, len1, str1W, len1W); + } + } + else + { + len1W = 0; str1W = buf1W; + } + + if (len2) + { + if (len2 <= 130) len2W = MultiByteToWideChar(locale_cp, 0, str2, len2, buf2W, 130); + if (len2W) + str2W = buf2W; + else + { + len2W = MultiByteToWideChar(locale_cp, 0, str2, len2, NULL, 0); + str2W = HeapAlloc(GetProcessHeap(), 0, len2W * sizeof(WCHAR)); + if (!str2W) + { + if (str1W != buf1W) HeapFree(GetProcessHeap(), 0, str1W); + SetLastError(ERROR_NOT_ENOUGH_MEMORY); + return 0; + } + MultiByteToWideChar(locale_cp, 0, str2, len2, str2W, len2W); + } + } else { - len1W = MultiByteToWideChar(locale_cp, 0, str1, len1, NULL, 0); - str1W = HeapAlloc(GetProcessHeap(), 0, len1W * sizeof(WCHAR)); - if (!str1W) - { - SetLastError(ERROR_NOT_ENOUGH_MEMORY); - return 0; - } - MultiByteToWideChar(locale_cp, 0, str1, len1, str1W, len1W); - } - len2W = MultiByteToWideChar(locale_cp, 0, str2, len2, buf2W, 130); - if (len2W) + len2W = 0; str2W = buf2W; - else - { - len2W = MultiByteToWideChar(locale_cp, 0, str2, len2, NULL, 0); - str2W = HeapAlloc(GetProcessHeap(), 0, len2W * sizeof(WCHAR)); - if (!str2W) - { - if (str1W != buf1W) HeapFree(GetProcessHeap(), 0, str1W); - SetLastError(ERROR_NOT_ENOUGH_MEMORY); - return 0; - } - MultiByteToWideChar(locale_cp, 0, str2, len2, str2W, len2W); - } - - ret = CompareStringW(lcid, style, str1W, len1W, str2W, len2W); + } + + ret = CompareStringW(lcid, flags, str1W, len1W, str2W, len2W);
if (str1W != buf1W) HeapFree(GetProcessHeap(), 0, str1W); if (str2W != buf2W) HeapFree(GetProcessHeap(), 0, str2W);