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/…
==============================================================================
--- 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);