[Kernel] Add better NULL checks to lstrcmp[i](A\W) functions.

Lionel Ulmer lionel.ulmer at free.fr
Sun Apr 4 09:10:40 CDT 2004


In the current code, the 'lstrcmpXX' functions did not crash on NULL calls..
But they did NOT return the correct values (ie it was not the same as
Windows does as they always did return 0 when one of the string was NULL).

A game I was testing (GeneRally - very nice free game BTW) seems to rely on
this 'feature' to work properly.

I also added some test cases which passes on Wine and, from what Mike told
me on IRC, will pass on Windows too :-)

         Lionel

Changelog:
 - Add better NULL checks to lstrcmp[i](A\W) functions.

-- 
		 Lionel Ulmer - http://www.bbrox.org/
-------------- next part --------------
Index: dlls/kernel/locale.c
===================================================================
RCS file: /home/wine/wine/dlls/kernel/locale.c,v
retrieving revision 1.36
diff -u -r1.36 locale.c
--- dlls/kernel/locale.c	9 Mar 2004 00:41:00 -0000	1.36
+++ dlls/kernel/locale.c	4 Apr 2004 14:07:23 -0000
@@ -2350,8 +2350,15 @@
  */
 int WINAPI lstrcmpA(LPCSTR str1, LPCSTR str2)
 {
-    int ret = CompareStringA(GetThreadLocale(), 0, str1, -1, str2, -1);
+    int ret;
+    
+    if ((str1 == NULL) && (str2 == NULL)) return 0;
+    if (str1 == NULL) return -1;
+    if (str2 == NULL) return 1;
+
+    ret = CompareStringA(GetThreadLocale(), 0, str1, -1, str2, -1);
     if (ret) ret -= 2;
+    
     return ret;
 }
 
@@ -2372,8 +2379,15 @@
  */
 int WINAPI lstrcmpiA(LPCSTR str1, LPCSTR str2)
 {
-    int ret = CompareStringA(GetThreadLocale(), NORM_IGNORECASE, str1, -1, str2, -1);
+    int ret;
+    
+    if ((str1 == NULL) && (str2 == NULL)) return 0;
+    if (str1 == NULL) return -1;
+    if (str2 == NULL) return 1;
+
+    ret = CompareStringA(GetThreadLocale(), NORM_IGNORECASE, str1, -1, str2, -1);
     if (ret) ret -= 2;
+    
     return ret;
 }
 
@@ -2384,8 +2398,15 @@
  */
 int WINAPI lstrcmpW(LPCWSTR str1, LPCWSTR str2)
 {
-    int ret = CompareStringW(GetThreadLocale(), 0, str1, -1, str2, -1);
+    int ret;
+
+    if ((str1 == NULL) && (str2 == NULL)) return 0;
+    if (str1 == NULL) return -1;
+    if (str2 == NULL) return 1;
+
+    ret = CompareStringW(GetThreadLocale(), 0, str1, -1, str2, -1);
     if (ret) ret -= 2;
+    
     return ret;
 }
 
@@ -2396,8 +2417,15 @@
  */
 int WINAPI lstrcmpiW(LPCWSTR str1, LPCWSTR str2)
 {
-    int ret = CompareStringW(GetThreadLocale(), NORM_IGNORECASE, str1, -1, str2, -1);
+    int ret;
+    
+    if ((str1 == NULL) && (str2 == NULL)) return 0;
+    if (str1 == NULL) return -1;
+    if (str2 == NULL) return 1;
+
+    ret = CompareStringW(GetThreadLocale(), NORM_IGNORECASE, str1, -1, str2, -1);
     if (ret) ret -= 2;
+    
     return ret;
 }
 
Index: dlls/kernel/tests/locale.c
===================================================================
RCS file: /home/wine/wine/dlls/kernel/tests/locale.c,v
retrieving revision 1.27
diff -u -r1.27 locale.c
--- dlls/kernel/tests/locale.c	7 Feb 2004 01:28:45 -0000	1.27
+++ dlls/kernel/tests/locale.c	4 Apr 2004 14:07:24 -0000
@@ -795,8 +795,17 @@
     ok(!ret, "CompareStringA must fail with invalid flag\n");
 
     ret = lstrcmpA("", "");
-    ok (!ret, "lstrcmpA(\"\", \"\") should return 0, got %d\n", ret);
+    ok (ret == 0, "lstrcmpA(\"\", \"\") should return 0, got %d\n", ret);
 
+    ret = lstrcmpA(NULL, NULL);
+    ok (ret == 0, "lstrcmpA(NULL, NULL) should return 0, got %d\n", ret);
+
+    ret = lstrcmpA("", NULL);
+    ok (ret == 1, "lstrcmpA(\"\", NULL) should return 1, got %d\n", ret);
+
+    ret = lstrcmpA(NULL, "");
+    ok (ret == -1, "lstrcmpA(NULL, \"\") should return -1, got %d\n", ret);
+  
     ret = CompareStringA(LOCALE_SYSTEM_DEFAULT,0,"EndDialog",-1,"_Property",-1);
     ok( ret == 3, "EndDialog vs _Property ... expected 3, got %d\n", ret);
 


More information about the wine-patches mailing list