Module: wine Branch: master Commit: 1a3777e2dc9378961fd44d58a10ead826a3c63d1 URL: http://source.winehq.org/git/wine.git/?a=commit;h=1a3777e2dc9378961fd44d58a1...
Author: Alexandre Julliard julliard@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;