Alexandre Julliard : ntdll: Reject VirtualAlloc blocks in NtUnmapViewOfSection.

Alexandre Julliard julliard at winehq.org
Thu Nov 5 10:50:00 CST 2009


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Wed Nov  4 19:53:00 2009 +0100

ntdll: Reject VirtualAlloc blocks in NtUnmapViewOfSection.

---

 dlls/kernel32/tests/virtual.c |   18 ++++++++++++++++++
 dlls/ntdll/virtual.c          |    4 ++--
 2 files changed, 20 insertions(+), 2 deletions(-)

diff --git a/dlls/kernel32/tests/virtual.c b/dlls/kernel32/tests/virtual.c
index b7e97db..5187a97 100644
--- a/dlls/kernel32/tests/virtual.c
+++ b/dlls/kernel32/tests/virtual.c
@@ -748,6 +748,24 @@ static void test_MapViewOfFile(void)
     ret = UnmapViewOfFile(ptr);
     ok(ret, "UnmapViewOfFile failed with error %d\n", GetLastError());
     CloseHandle(mapping);
+
+    addr = VirtualAlloc(NULL, 0x10000, MEM_COMMIT, PAGE_READONLY );
+    ok( addr != NULL, "VirtualAlloc failed with error %u\n", GetLastError() );
+
+    SetLastError(0xdeadbeef);
+    ok( !UnmapViewOfFile(addr), "UnmapViewOfFile should fail on VirtualAlloc mem\n" );
+    ok( GetLastError() == ERROR_INVALID_ADDRESS,
+        "got %u, expected ERROR_INVALID_ADDRESS\n", GetLastError());
+    SetLastError(0xdeadbeef);
+    ok( !UnmapViewOfFile((char *)addr + 0x3000), "UnmapViewOfFile should fail on VirtualAlloc mem\n" );
+    ok( GetLastError() == ERROR_INVALID_ADDRESS,
+        "got %u, expected ERROR_INVALID_ADDRESS\n", GetLastError());
+    SetLastError(0xdeadbeef);
+    ok( !UnmapViewOfFile((void *)0xdeadbeef), "UnmapViewOfFile should fail on VirtualAlloc mem\n" );
+    ok( GetLastError() == ERROR_INVALID_ADDRESS,
+       "got %u, expected ERROR_INVALID_ADDRESS\n", GetLastError());
+
+    ok( VirtualFree(addr, 0, MEM_RELEASE), "VirtualFree failed\n" );
 }
 
 static DWORD (WINAPI *pNtMapViewOfSection)( HANDLE handle, HANDLE process, PVOID *addr_ptr,
diff --git a/dlls/ntdll/virtual.c b/dlls/ntdll/virtual.c
index fe2ef26..f568eee 100644
--- a/dlls/ntdll/virtual.c
+++ b/dlls/ntdll/virtual.c
@@ -2533,7 +2533,7 @@ done:
 NTSTATUS WINAPI NtUnmapViewOfSection( HANDLE process, PVOID addr )
 {
     FILE_VIEW *view;
-    NTSTATUS status = STATUS_INVALID_PARAMETER;
+    NTSTATUS status = STATUS_NOT_MAPPED_VIEW;
     sigset_t sigset;
     void *base = ROUND_ADDR( addr, page_mask );
 
@@ -2552,7 +2552,7 @@ NTSTATUS WINAPI NtUnmapViewOfSection( HANDLE process, PVOID addr )
     }
 
     server_enter_uninterrupted_section( &csVirtual, &sigset );
-    if ((view = VIRTUAL_FindView( base, 0 )) && (base == view->base))
+    if ((view = VIRTUAL_FindView( base, 0 )) && (base == view->base) && !(view->protect & VPROT_VALLOC))
     {
         delete_view( view );
         status = STATUS_SUCCESS;




More information about the wine-cvs mailing list