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