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