Use local buffer in RtlUpcaseUnicodeStringToCountedOemString, if
authorUwe Bonnes <bon@elektron.ikp.physik.tu-darmstadt.de>
Tue, 15 Feb 2005 20:48:38 +0000 (20:48 +0000)
committerAlexandre Julliard <julliard@winehq.org>
Tue, 15 Feb 2005 20:48:38 +0000 (20:48 +0000)
appropriate.

dlls/ntdll/rtlstr.c

index ccedf876b9bf4c7a694796929272bbe775a8eca6..e8db8459bb23ae2246645082b7d717db88eba720 100644 (file)
@@ -1071,8 +1071,14 @@ NTSTATUS WINAPI RtlUpcaseUnicodeStringToCountedOemString( STRING *oem,
 {
     NTSTATUS ret;
     UNICODE_STRING upcase;
+    WCHAR tmp[32];
 
-    if (!(ret = RtlUpcaseUnicodeString( &upcase, uni, TRUE )))
+    upcase.Buffer = tmp;
+    upcase.MaximumLength = sizeof(tmp);
+    ret = RtlUpcaseUnicodeString( &upcase, uni, FALSE );
+    if (ret == STATUS_BUFFER_OVERFLOW) ret = RtlUpcaseUnicodeString( &upcase, uni, TRUE );
+
+    if (!ret)
     {
         DWORD len = RtlUnicodeStringToOemSize( &upcase ) - 1;
         oem->Length = len;
@@ -1093,7 +1099,7 @@ NTSTATUS WINAPI RtlUpcaseUnicodeStringToCountedOemString( STRING *oem,
         }
         RtlUnicodeToOemN( oem->Buffer, oem->Length, NULL, upcase.Buffer, upcase.Length );
     done:
-        RtlFreeUnicodeString( &upcase );
+        if (upcase.Buffer != tmp) RtlFreeUnicodeString( &upcase );
     }
     return ret;
 }