Alexandre Julliard : kernel32/tests: Add test cases for reading/ writing process memory from an invalid buffer address.

Alexandre Julliard julliard at winehq.org
Thu Jan 15 08:50:58 CST 2009


Module: wine
Branch: master
Commit: 31fd0663936d3b6228a45f326f9221fc1fe9054f
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=31fd0663936d3b6228a45f326f9221fc1fe9054f

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Wed Jan 14 20:36:42 2009 +0100

kernel32/tests: Add test cases for reading/writing process memory from an invalid buffer address.

---

 dlls/kernel32/tests/virtual.c |   37 +++++++++++++++++++++++++++++++++----
 1 files changed, 33 insertions(+), 4 deletions(-)

diff --git a/dlls/kernel32/tests/virtual.c b/dlls/kernel32/tests/virtual.c
index 6990543..ae812cd 100644
--- a/dlls/kernel32/tests/virtual.c
+++ b/dlls/kernel32/tests/virtual.c
@@ -84,8 +84,8 @@ static void test_VirtualAllocEx(void)
         return;
     }
 
-    src = HeapAlloc( GetProcessHeap(), 0, alloc_size );
-    dst = HeapAlloc( GetProcessHeap(), 0, alloc_size );
+    src = VirtualAlloc( NULL, alloc_size, MEM_COMMIT, PAGE_READWRITE );
+    dst = VirtualAlloc( NULL, alloc_size, MEM_COMMIT, PAGE_READWRITE );
     for (i = 0; i < alloc_size; i++)
         src[i] = i & 0xff;
 
@@ -96,11 +96,40 @@ static void test_VirtualAllocEx(void)
     b = ReadProcessMemory(hProcess, addr1, dst, alloc_size, &bytes_read);
     ok(b && (bytes_read == alloc_size), "%lu bytes read\n", bytes_read);
     ok(!memcmp(src, dst, alloc_size), "Data from remote process differs\n");
+
+    /* test invalid source buffers */
+
+    b = VirtualProtect( src + 0x2000, 0x2000, PAGE_NOACCESS, &old_prot );
+    ok( b, "VirtualProtect failed error %u\n", GetLastError() );
+    b = WriteProcessMemory(hProcess, addr1, src, alloc_size, &bytes_written);
+    ok( !b, "WriteProcessMemory succeeded\n" );
+    ok( GetLastError() == ERROR_NOACCESS ||
+        GetLastError() == ERROR_PARTIAL_COPY, /* vista */
+        "wrong error %u\n", GetLastError() );
+    ok( bytes_written == 0, "%lu bytes written\n", bytes_written );
+    b = ReadProcessMemory(hProcess, addr1, src, alloc_size, &bytes_read);
+    ok( !b, "ReadProcessMemory succeeded\n" );
+    ok( GetLastError() == ERROR_NOACCESS, "wrong error %u\n", GetLastError() );
+    ok( bytes_read == 0, "%lu bytes written\n", bytes_read );
+
+    b = VirtualProtect( src, 0x2000, PAGE_NOACCESS, &old_prot );
+    ok( b, "VirtualProtect failed error %u\n", GetLastError() );
+    b = WriteProcessMemory(hProcess, addr1, src, alloc_size, &bytes_written);
+    ok( !b, "WriteProcessMemory succeeded\n" );
+    ok( GetLastError() == ERROR_NOACCESS ||
+        GetLastError() == ERROR_PARTIAL_COPY, /* vista */
+        "wrong error %u\n", GetLastError() );
+    ok( bytes_written == 0, "%lu bytes written\n", bytes_written );
+    b = ReadProcessMemory(hProcess, addr1, src, alloc_size, &bytes_read);
+    ok( !b, "ReadProcessMemory succeeded\n" );
+    ok( GetLastError() == ERROR_NOACCESS, "wrong error %u\n", GetLastError() );
+    ok( bytes_read == 0, "%lu bytes written\n", bytes_read );
+
     b = pVirtualFreeEx(hProcess, addr1, 0, MEM_RELEASE);
     ok(b != 0, "VirtualFreeEx, error %u\n", GetLastError());
 
-    HeapFree( GetProcessHeap(), 0, src );
-    HeapFree( GetProcessHeap(), 0, dst );
+    VirtualFree( src, 0, MEM_FREE );
+    VirtualFree( dst, 0, MEM_FREE );
 
     /*
      * The following tests parallel those in test_VirtualAlloc()




More information about the wine-cvs mailing list