Alexandre Julliard : ntdll: Add parameter checking in RtlNormalizeString().

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


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Mon Feb  3 13:29:55 2020 +0100

ntdll: Add parameter checking in RtlNormalizeString().

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

---

 dlls/kernel32/tests/locale.c | 11 +++++++----
 dlls/ntdll/locale.c          | 15 ++++++++++++---
 2 files changed, 19 insertions(+), 7 deletions(-)

diff --git a/dlls/kernel32/tests/locale.c b/dlls/kernel32/tests/locale.c
index 751b508e83..ea591d851c 100644
--- a/dlls/kernel32/tests/locale.c
+++ b/dlls/kernel32/tests/locale.c
@@ -6184,12 +6184,14 @@ static void test_NormalizeString(void)
         case NormalizationKC:
         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());
             break;
         default:
-            todo_wine ok( dstlen <= 0, "%d: wrong len %d\n", i, dstlen );
-            todo_wine ok( GetLastError() == ERROR_INVALID_PARAMETER, "%d: got error %u\n", i, GetLastError());
+            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;
         }
         if (pRtlNormalizeString)
@@ -6199,17 +6201,18 @@ static void test_NormalizeString(void)
             switch (i)
             {
             case 0:
-                todo_wine ok( status == STATUS_INVALID_PARAMETER, "%d: failed %x\n", i, status );
+                ok( status == STATUS_INVALID_PARAMETER, "%d: failed %x\n", i, status );
                 break;
             case NormalizationC:
             case NormalizationD:
             case NormalizationKC:
             case NormalizationKD:
             case 13:  /* Idn */
+                todo_wine_if (i == 13)
                 ok( status == STATUS_SUCCESS, "%d: failed %x\n", i, status );
                 break;
             default:
-                todo_wine ok( status == STATUS_OBJECT_NAME_NOT_FOUND, "%d: failed %x\n", i, status );
+                ok( status == STATUS_OBJECT_NAME_NOT_FOUND, "%d: failed %x\n", i, status );
                 break;
             }
         }
diff --git a/dlls/ntdll/locale.c b/dlls/ntdll/locale.c
index dfd48eb0f8..f9d65e47fd 100644
--- a/dlls/ntdll/locale.c
+++ b/dlls/ntdll/locale.c
@@ -1687,17 +1687,26 @@ NTSTATUS WINAPI RtlIsNormalizedString( ULONG form, const WCHAR *str, INT len, BO
  */
 NTSTATUS WINAPI RtlNormalizeString( ULONG form, const WCHAR *src, INT src_len, WCHAR *dst, INT *dst_len )
 {
-    int flags = 0, compose = 0;
+    int flags = 0, compose, compat;
     unsigned int res, buf_len;
     WCHAR *buf = NULL;
     NTSTATUS status = STATUS_SUCCESS;
 
     TRACE( "%x %s %d %p %d\n", form, debugstr_wn(src, src_len), src_len, dst, *dst_len );
 
+    switch (form)
+    {
+    case NormalizationC:  compose = 1; compat = 0; break;
+    case NormalizationD:  compose = 0; compat = 0; break;
+    case NormalizationKC: compose = 1; compat = 1; break;
+    case NormalizationKD: compose = 0; compat = 1; break;
+    case 0: return STATUS_INVALID_PARAMETER;
+    default: return STATUS_OBJECT_NAME_NOT_FOUND;
+    }
+
     if (src_len == -1) src_len = strlenW(src) + 1;
 
-    if (form == NormalizationKC || form == NormalizationKD) flags |= WINE_DECOMPOSE_COMPAT;
-    if (form == NormalizationC || form == NormalizationKC) compose = 1;
+    if (compat) flags |= WINE_DECOMPOSE_COMPAT;
     if (compose || *dst_len) flags |= WINE_DECOMPOSE_REORDER;
 
     if (!compose && *dst_len)




More information about the wine-cvs mailing list