Alexandre Julliard : kernel32/tests: Add some tests for FormatMessageA/W buffer sizes.

Alexandre Julliard julliard at winehq.org
Wed May 13 16:29:54 CDT 2020


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Wed May 13 20:26:25 2020 +0200

kernel32/tests: Add some tests for FormatMessageA/W buffer sizes.

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

---

 dlls/kernel32/tests/format_msg.c | 87 +++++++++++++++++++++++++++++++++++++++-
 1 file changed, 85 insertions(+), 2 deletions(-)

diff --git a/dlls/kernel32/tests/format_msg.c b/dlls/kernel32/tests/format_msg.c
index 7fed5ee4e5..7fd9d55377 100644
--- a/dlls/kernel32/tests/format_msg.c
+++ b/dlls/kernel32/tests/format_msg.c
@@ -1009,7 +1009,7 @@ static void test_message_insufficient_buffer(void)
 {
     static const char init_buf[] = {'x', 'x', 'x', 'x', 'x'};
     static const char expected_buf[] = {'x', 'x', 'x', 'x', 'x'};
-    DWORD ret;
+    DWORD ret, size, i;
     CHAR out[5];
 
     SetLastError(0xdeadbeef);
@@ -1041,11 +1041,63 @@ static void test_message_insufficient_buffer(void)
        GetLastError());
     ok(!memcmp(expected_buf, out, sizeof(expected_buf)),
        "Expected the buffer to be untouched\n");
+
+    for (size = 32700; size < 32800; size++)
+    {
+        char *tmp = HeapAlloc( GetProcessHeap(), 0, size );
+        char *buf = HeapAlloc( GetProcessHeap(), 0, size );
+
+        for (i = 0; i < size; i++) tmp[i] = 'A' + i % 26;
+        tmp[size - 1] = 0;
+        SetLastError( 0xdeadbeef );
+        ret = FormatMessageA( FORMAT_MESSAGE_FROM_STRING, tmp, 0, 0, buf, size, NULL );
+        if (size < 32768)
+        {
+            ok( ret == size - 1, "%u: got %u\n", size, ret );
+            ok( !strcmp( tmp, buf ), "wrong buffer\n" );
+        }
+        else
+        {
+            ok( ret == 0, "%u: got %u\n", size, ret );
+            ok( GetLastError() == ERROR_INVALID_PARAMETER, "wrong error %u\n", GetLastError() );
+        }
+
+        SetLastError( 0xdeadbeef );
+        ret = doit( FORMAT_MESSAGE_FROM_STRING, "%1", 0, 0, buf, size, tmp );
+        if (size < 32768)
+        {
+            ok( ret == size - 1, "%u: got %u\n", size, ret );
+            ok( !strcmp( tmp, buf ), "wrong buffer\n" );
+        }
+        else
+        {
+            ok( ret == 0, "%u: got %u\n", size, ret );
+            ok( GetLastError() == ERROR_INVALID_PARAMETER || broken(GetLastError() == ERROR_MORE_DATA), /* winxp */
+                "wrong error %u\n", GetLastError() );
+        }
+        HeapFree( GetProcessHeap(), 0, buf );
+
+        SetLastError( 0xdeadbeef );
+        ret = FormatMessageA( FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_ALLOCATE_BUFFER,
+                              tmp, 0, 0, (char *)&buf, size, NULL );
+        if (size < 32768)
+        {
+            ok( ret == size - 1, "%u: got %u\n", size, ret );
+            ok( !strcmp( tmp, buf ), "wrong buffer\n" );
+            HeapFree( GetProcessHeap(), 0, buf );
+        }
+        else
+        {
+            ok( ret == 0, "%u: got %u\n", size, ret );
+            ok( GetLastError() == ERROR_INVALID_PARAMETER, "wrong error %u\n", GetLastError() );
+        }
+        HeapFree( GetProcessHeap(), 0, tmp );
+    }
 }
 
 static void test_message_insufficient_buffer_wide(void)
 {
-    DWORD ret;
+    DWORD ret, size, i;
     WCHAR out[8];
 
     SetLastError(0xdeadbeef);
@@ -1079,6 +1131,28 @@ static void test_message_insufficient_buffer_wide(void)
     ok(!memcmp(out, L"tes\0xx", 6 * sizeof(WCHAR)) ||
         broken(!lstrcmpW( out, L"xxxxxx" )), /* winxp */
         "Expected the buffer to be truncated\n");
+
+    for (size = 1000; size < 1000000; size += size / 10)
+    {
+        WCHAR *tmp = HeapAlloc( GetProcessHeap(), 0, size * sizeof(WCHAR) );
+        WCHAR *buf = HeapAlloc( GetProcessHeap(), 0, size * sizeof(WCHAR) );
+        for (i = 0; i < size; i++) tmp[i] = 'A' + i % 26;
+        tmp[size - 1] = 0;
+        ret = FormatMessageW( FORMAT_MESSAGE_FROM_STRING, tmp, 0, 0, buf, size, NULL );
+        ok(ret == size - 1 || broken(!ret), /* winxp */ "got %u\n", ret);
+        if (!ret) break;
+        ok( !lstrcmpW( tmp, buf ), "wrong buffer\n" );
+        ret = doitW( FORMAT_MESSAGE_FROM_STRING, L"%1", 0, 0, buf, size, tmp );
+        ok(ret == size - 1, "got %u\n", ret);
+        ok( !lstrcmpW( tmp, buf ), "wrong buffer\n" );
+        HeapFree( GetProcessHeap(), 0, buf );
+        ret = FormatMessageW( FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_ALLOCATE_BUFFER,
+                              tmp, 0, 0, (WCHAR *)&buf, size, NULL );
+        ok(ret == size - 1, "got %u\n", ret);
+        ok( !lstrcmpW( tmp, buf ), "wrong buffer\n" );
+        HeapFree( GetProcessHeap(), 0, tmp );
+        HeapFree( GetProcessHeap(), 0, buf );
+    }
 }
 
 static void test_message_null_buffer(void)
@@ -1279,6 +1353,15 @@ static void test_message_allocate_buffer_wide(void)
     ok(GetLastError() == ERROR_NO_WORK_DONE || broken(GetLastError() == 0xdeadbeef),
        "Expected GetLastError() to return ERROR_NO_WORK_DONE, got %u\n", GetLastError());
 
+    SetLastError(0xdeadbeef);
+    buf = (WCHAR *)0xdeadbeef;
+    ret = doitW(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_ALLOCATE_BUFFER, L"%1",
+                0, 0, (WCHAR *)&buf, 0, L"" );
+    ok(ret == 0, "Expected FormatMessageW to return 0, got %u\n", ret);
+    ok(buf == NULL, "Expected output buffer pointer to be NULL\n");
+    ok(GetLastError() == ERROR_NO_WORK_DONE || broken(GetLastError() == 0xdeadbeef),
+       "Expected GetLastError() to return ERROR_NO_WORK_DONE, got %u\n", GetLastError());
+
     buf = (WCHAR *)0xdeadbeef;
     ret = FormatMessageW(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_ALLOCATE_BUFFER,
                          L"test", 0, 0, (WCHAR *)&buf, 0, NULL);




More information about the wine-cvs mailing list