Alexandre Julliard : kernelbase: Fix NormalizeString() return value and last error.

Alexandre Julliard julliard at winehq.org
Mon Feb 3 15:06:05 CST 2020


Module: wine
Branch: master
Commit: 8d11c0871e1d1eafddc1505c7a11045083c37936
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=8d11c0871e1d1eafddc1505c7a11045083c37936

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Mon Feb  3 18:39:15 2020 +0100

kernelbase: Fix NormalizeString() return value and last error.

Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/kernel32/tests/locale.c | 23 +++++++++++------------
 dlls/kernelbase/locale.c     | 14 +++++++++++++-
 2 files changed, 24 insertions(+), 13 deletions(-)

diff --git a/dlls/kernel32/tests/locale.c b/dlls/kernel32/tests/locale.c
index 3ac3ee5de5..76a993e6c3 100644
--- a/dlls/kernel32/tests/locale.c
+++ b/dlls/kernel32/tests/locale.c
@@ -6034,12 +6034,10 @@ static void test_NormalizeString(void)
             dstlen = pNormalizeString( norm_forms[i], ptest->str, -1, NULL, 0 );
             ok( dstlen > lstrlenW(ptest->str), "%s:%d: wrong len %d / %d\n",
                 wine_dbgstr_w(ptest->str), i, dstlen, lstrlenW(ptest->str) );
-            todo_wine
             ok(GetLastError() == ERROR_SUCCESS, "%s:%d: got error %u\n",
                wine_dbgstr_w(ptest->str), i, GetLastError());
             SetLastError(0xdeadbeef);
             dstlen = pNormalizeString( norm_forms[i], ptest->str, -1, dst, dstlen );
-            todo_wine
             ok(GetLastError() == ERROR_SUCCESS, "%s:%d: got error %u\n",
                wine_dbgstr_w(ptest->str), i, GetLastError());
             ok(dstlen == lstrlenW( dst )+1, "%s:%d: Copied length differed: was %d, should be %d\n",
@@ -6086,33 +6084,33 @@ static void test_NormalizeString(void)
 
     SetLastError(0xdeadbeef);
     dstlen = pNormalizeString( NormalizationD, part0_str1, -1, dst, 1 );
-    todo_wine ok( dstlen <= 0, "wrong len %d\n", dstlen );
+    ok( dstlen <= 0, "wrong len %d\n", dstlen );
     ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "got error %u\n", GetLastError());
 
     SetLastError(0xdeadbeef);
     dstlen = pNormalizeString( NormalizationC, part0_str2, -1, dst, 1 );
-    todo_wine ok( dstlen <= 0, "wrong len %d\n", dstlen );
+    ok( dstlen <= 0, "wrong len %d\n", dstlen );
     ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "got error %u\n", GetLastError());
 
     SetLastError(0xdeadbeef);
     dstlen = pNormalizeString( NormalizationC, part0_str2, -1, NULL, 0 );
     ok( dstlen == 12, "wrong len %d\n", dstlen );
-    todo_wine ok(GetLastError() == ERROR_SUCCESS, "got error %u\n", GetLastError());
+    ok(GetLastError() == ERROR_SUCCESS, "got error %u\n", GetLastError());
 
     SetLastError(0xdeadbeef);
     dstlen = pNormalizeString( NormalizationC, part0_str2, -1, dst, 3 );
     ok( dstlen == 3, "wrong len %d\n", dstlen );
-    todo_wine ok(GetLastError() == ERROR_SUCCESS, "got error %u\n", GetLastError());
+    ok(GetLastError() == ERROR_SUCCESS, "got error %u\n", GetLastError());
 
     SetLastError(0xdeadbeef);
     dstlen = pNormalizeString( NormalizationC, part0_str2, 0, NULL, 0 );
     ok( dstlen == 0, "wrong len %d\n", dstlen );
-    todo_wine ok(GetLastError() == ERROR_SUCCESS, "got error %u\n", GetLastError());
+    ok(GetLastError() == ERROR_SUCCESS, "got error %u\n", GetLastError());
 
     SetLastError(0xdeadbeef);
     dstlen = pNormalizeString( NormalizationC, part0_str2, 0, dst, 3 );
     ok( dstlen == 0, "wrong len %d\n", dstlen );
-    todo_wine ok(GetLastError() == ERROR_SUCCESS, "got error %u\n", GetLastError());
+    ok(GetLastError() == ERROR_SUCCESS, "got error %u\n", GetLastError());
 
     /* size estimations */
 
@@ -6144,11 +6142,11 @@ static void test_NormalizeString(void)
         if (i == 0 || i == 2)
         {
             ok( dstlen == srclen, "%d: wrong len %d\n", i, dstlen );
-            todo_wine ok(GetLastError() == ERROR_SUCCESS, "got error %u\n", GetLastError());
+            ok(GetLastError() == ERROR_SUCCESS, "got error %u\n", GetLastError());
         }
         else
         {
-            todo_wine ok( dstlen < -expect, "%d: wrong len %d\n", i, dstlen );
+            ok( dstlen < -expect, "%d: wrong len %d\n", i, dstlen );
             ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "got error %u\n", GetLastError());
         }
         if (pRtlNormalizeString)
@@ -6185,12 +6183,13 @@ static void test_NormalizeString(void)
         case NormalizationKD:
         case 13:  /* Idn */
             todo_wine_if (i == 13)
+            {
             ok( dstlen > 0, "%d: wrong len %d\n", i, dstlen );
-            todo_wine ok( GetLastError() == ERROR_SUCCESS, "%d: got error %u\n", i, GetLastError());
+            ok( GetLastError() == ERROR_SUCCESS, "%d: got error %u\n", i, GetLastError());
+            }
             break;
         default:
             ok( dstlen <= 0, "%d: wrong len %d\n", i, dstlen );
-            todo_wine_if (i)
             ok( GetLastError() == ERROR_INVALID_PARAMETER, "%d: got error %u\n", i, GetLastError());
             break;
         }
diff --git a/dlls/kernelbase/locale.c b/dlls/kernelbase/locale.c
index c697da16eb..a2d4735c30 100644
--- a/dlls/kernelbase/locale.c
+++ b/dlls/kernelbase/locale.c
@@ -4923,7 +4923,19 @@ INT WINAPI DECLSPEC_HOTPATCH MultiByteToWideChar( UINT codepage, DWORD flags, co
 INT WINAPI DECLSPEC_HOTPATCH NormalizeString(NORM_FORM form, const WCHAR *src, INT src_len,
                                              WCHAR *dst, INT dst_len)
 {
-    set_ntstatus( RtlNormalizeString( form, src, src_len, dst, &dst_len ));
+    NTSTATUS status = RtlNormalizeString( form, src, src_len, dst, &dst_len );
+
+    switch (status)
+    {
+    case STATUS_OBJECT_NAME_NOT_FOUND:
+        status = STATUS_INVALID_PARAMETER;
+        break;
+    case STATUS_BUFFER_TOO_SMALL:
+    case STATUS_NO_UNICODE_TRANSLATION:
+        dst_len = -dst_len;
+        break;
+    }
+    SetLastError( RtlNtStatusToDosError( status ));
     return dst_len;
 }
 




More information about the wine-cvs mailing list