[1/2] user32: Properly handle invalid parameters in CharToOem[Buff]A and OemToChar[Buff]A.

Sebastian Lackner sebastian at fds-team.de
Thu Jul 7 22:11:42 CDT 2016


From: Dmitry Timoshkov <dmitry at baikal.ru>

Signed-off-by: Dmitry Timoshkov <dmitry at baikal.ru>
Signed-off-by: Sebastian Lackner <sebastian at fds-team.de>
---
 dlls/user32/lstr.c       |    7 +++++-
 dlls/user32/tests/text.c |   48 ++++++++++++++++++++++++++++++++++++++++++++++-
 2 files changed, 53 insertions(+), 2 deletions(-)

diff --git a/dlls/user32/lstr.c b/dlls/user32/lstr.c
index a56e21c..79a7b27 100644
--- a/dlls/user32/lstr.c
+++ b/dlls/user32/lstr.c
@@ -136,7 +136,7 @@ LPWSTR WINAPI CharPrevW(LPCWSTR start,LPCWSTR x)
  */
 BOOL WINAPI CharToOemA( LPCSTR s, LPSTR d )
 {
-    if ( !s || !d ) return TRUE;
+    if (!s || !d) return FALSE;
     return CharToOemBuffA( s, d, strlen( s ) + 1 );
 }
 
@@ -148,6 +148,8 @@ BOOL WINAPI CharToOemBuffA( LPCSTR s, LPSTR d, DWORD len )
 {
     WCHAR *bufW;
 
+    if (!s || !d) return FALSE;
+
     bufW = HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR) );
     if( bufW )
     {
@@ -184,6 +186,7 @@ BOOL WINAPI CharToOemW( LPCWSTR s, LPSTR d )
  */
 BOOL WINAPI OemToCharA( LPCSTR s, LPSTR d )
 {
+    if (!s || !d) return FALSE;
     return OemToCharBuffA( s, d, strlen( s ) + 1 );
 }
 
@@ -195,6 +198,8 @@ BOOL WINAPI OemToCharBuffA( LPCSTR s, LPSTR d, DWORD len )
 {
     WCHAR *bufW;
 
+    if (!s || !d) return FALSE;
+
     bufW = HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR) );
     if( bufW )
     {
diff --git a/dlls/user32/tests/text.c b/dlls/user32/tests/text.c
index 8438f10..172ab6e 100644
--- a/dlls/user32/tests/text.c
+++ b/dlls/user32/tests/text.c
@@ -2,7 +2,7 @@
  * DrawText tests
  *
  * Copyright (c) 2004 Zach Gorman
- * Copyright 2007 Dmitry Timoshkov
+ * Copyright 2007,2016 Dmitry Timoshkov
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -728,9 +728,55 @@ static void test_DrawState(void)
     DestroyWindow(hwnd);
 }
 
+static void test_CharToOem_OemToChar(void)
+{
+    static const char helloWorld[] = "Hello World";
+    static const struct
+    {
+        BOOL src, dst, ret;
+    }
+    tests[] =
+    {
+        { FALSE, FALSE, FALSE },
+        { TRUE,  FALSE, FALSE },
+        { FALSE, TRUE,  FALSE },
+        { TRUE,  TRUE,  TRUE  },
+    };
+    BOOL ret;
+    int i;
+
+    for (i = 0; i < sizeof(tests)/sizeof(tests[0]); i++)
+    {
+        const char *expected = tests[i].ret ? helloWorld : "";
+        const char *src = tests[i].src ? helloWorld : NULL;
+        char buf[64], *dst = tests[i].dst ? buf : NULL;
+
+        memset(buf, 0, sizeof(buf));
+        ret = CharToOemA(src, dst);
+        ok(ret == tests[i].ret, "test %d: expected %d, got %d\n", i, tests[i].ret, ret);
+        ok(!strcmp(buf, expected), "test %d: got '%s'\n", i, buf);
+
+        memset(buf, 0, sizeof(buf));
+        ret = CharToOemBuffA(src, dst, sizeof(helloWorld));
+        ok(ret == tests[i].ret, "test %d: expected %d, got %d\n", i, tests[i].ret, ret);
+        ok(!strcmp(buf, expected), "test %d: got '%s'\n", i, buf);
+
+        memset(buf, 0, sizeof(buf));
+        ret = OemToCharA(src, dst);
+        ok(ret == tests[i].ret, "test %d: expected %d, got %d\n", i, tests[i].ret, ret);
+        ok(!strcmp(buf, expected), "test %d: got '%s'\n", i, buf);
+
+        memset(buf, 0, sizeof(buf));
+        ret = OemToCharBuffA(src, dst, sizeof(helloWorld));
+        ok(ret == tests[i].ret, "test %d: expected %d, got %d\n", i, tests[i].ret, ret);
+        ok(!strcmp(buf, expected), "test %d: got '%s'\n", i, buf);
+    }
+}
+
 START_TEST(text)
 {
     test_TabbedText();
     test_DrawTextCalcRect();
     test_DrawState();
+    test_CharToOem_OemToChar();
 }
-- 
2.8.0



More information about the wine-patches mailing list