Alexandre Julliard : ntdll: Fix access rights checks for mapping objects.
Alexandre Julliard
julliard at winehq.org
Tue Sep 12 15:40:38 CDT 2017
Module: wine
Branch: master
Commit: 94872cc84fc92a38f9009e4aa36740474781cfae
URL: http://source.winehq.org/git/wine.git/?a=commit;h=94872cc84fc92a38f9009e4aa36740474781cfae
Author: Alexandre Julliard <julliard at winehq.org>
Date: Tue Sep 12 10:33:33 2017 +0200
ntdll: Fix access rights checks for mapping objects.
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/kernel32/tests/virtual.c | 16 +++++-----------
dlls/ntdll/loader.c | 3 ++-
dlls/ntdll/virtual.c | 10 ++++++----
3 files changed, 13 insertions(+), 16 deletions(-)
diff --git a/dlls/kernel32/tests/virtual.c b/dlls/kernel32/tests/virtual.c
index 46b019c..1201863 100644
--- a/dlls/kernel32/tests/virtual.c
+++ b/dlls/kernel32/tests/virtual.c
@@ -3710,16 +3710,16 @@ static DWORD map_prot_to_access(DWORD prot)
switch (prot)
{
case PAGE_READWRITE:
- return SECTION_MAP_READ | SECTION_MAP_WRITE | SECTION_MAP_EXECUTE | SECTION_QUERY;
+ return SECTION_MAP_READ | SECTION_MAP_WRITE | SECTION_QUERY;
case PAGE_EXECUTE_READWRITE:
- return SECTION_MAP_READ | SECTION_MAP_WRITE | SECTION_MAP_EXECUTE | SECTION_MAP_EXECUTE_EXPLICIT | SECTION_QUERY;
+ return SECTION_MAP_READ | SECTION_MAP_WRITE | SECTION_MAP_EXECUTE | SECTION_QUERY;
case PAGE_READONLY:
case PAGE_WRITECOPY:
- return SECTION_MAP_READ | SECTION_MAP_EXECUTE | SECTION_QUERY;
+ return SECTION_MAP_READ | SECTION_QUERY;
case PAGE_EXECUTE:
case PAGE_EXECUTE_READ:
case PAGE_EXECUTE_WRITECOPY:
- return SECTION_MAP_READ | SECTION_MAP_EXECUTE | SECTION_MAP_EXECUTE_EXPLICIT | SECTION_QUERY;
+ return SECTION_MAP_READ | SECTION_MAP_EXECUTE | SECTION_QUERY;
default:
return 0;
}
@@ -3909,17 +3909,11 @@ static void test_mapping( HANDLE hfile, DWORD sec_flags )
/* FILE_MAP_EXECUTE | FILE_MAP_COPY broken on XP */
if (base != NULL && view[j].access == (FILE_MAP_EXECUTE | FILE_MAP_COPY))
{
- todo_wine
ok( broken(base != NULL), "%d: MapViewOfFile(%04x/%04x) should fail\n",
j, page_prot[i], view[j].access);
UnmapViewOfFile( base );
}
- else todo_wine_if ((page_prot[i] == PAGE_READONLY &&
- is_compatible_access( PAGE_EXECUTE_READ, view[j].access )) ||
- (page_prot[i] == PAGE_READWRITE &&
- is_compatible_access( PAGE_EXECUTE_READWRITE, view[j].access )) ||
- (page_prot[i] == PAGE_WRITECOPY &&
- is_compatible_access( PAGE_EXECUTE_WRITECOPY, view[j].access )))
+ else
{
ok(!base, "%d: MapViewOfFile(%04x/%04x) should fail\n",
j, page_prot[i], view[j].access);
diff --git a/dlls/ntdll/loader.c b/dlls/ntdll/loader.c
index 76edd2a..295b5e8 100644
--- a/dlls/ntdll/loader.c
+++ b/dlls/ntdll/loader.c
@@ -1842,7 +1842,8 @@ static NTSTATUS load_native_dll( LPCWSTR load_path, LPCWSTR name, HANDLE file,
TRACE("Trying native dll %s\n", debugstr_w(name));
size.QuadPart = 0;
- status = NtCreateSection( &mapping, STANDARD_RIGHTS_REQUIRED | SECTION_QUERY | SECTION_MAP_READ,
+ status = NtCreateSection( &mapping, STANDARD_RIGHTS_REQUIRED | SECTION_QUERY |
+ SECTION_MAP_READ | SECTION_MAP_EXECUTE,
NULL, &size, PAGE_EXECUTE_READ, SEC_IMAGE, file );
if (status != STATUS_SUCCESS) return status;
diff --git a/dlls/ntdll/virtual.c b/dlls/ntdll/virtual.c
index bcd9680..d2cd076 100644
--- a/dlls/ntdll/virtual.c
+++ b/dlls/ntdll/virtual.c
@@ -2750,18 +2750,20 @@ NTSTATUS WINAPI NtMapViewOfSection( HANDLE handle, HANDLE process, PVOID *addr_p
switch(protect)
{
case PAGE_NOACCESS:
+ case PAGE_READONLY:
+ case PAGE_WRITECOPY:
access = SECTION_MAP_READ;
break;
case PAGE_READWRITE:
- case PAGE_EXECUTE_READWRITE:
access = SECTION_MAP_WRITE;
break;
- case PAGE_READONLY:
- case PAGE_WRITECOPY:
case PAGE_EXECUTE:
case PAGE_EXECUTE_READ:
case PAGE_EXECUTE_WRITECOPY:
- access = SECTION_MAP_READ;
+ access = SECTION_MAP_READ | SECTION_MAP_EXECUTE;
+ break;
+ case PAGE_EXECUTE_READWRITE:
+ access = SECTION_MAP_WRITE | SECTION_MAP_EXECUTE;
break;
default:
return STATUS_INVALID_PAGE_PROTECTION;
More information about the wine-cvs
mailing list