Jacek Caban : ntdll: Always use MAP_SHARED in NtMapViewOfSection.

Alexandre Julliard julliard at winehq.org
Thu May 8 13:35:20 CDT 2014


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Thu May  8 18:22:08 2014 +0200

ntdll: Always use MAP_SHARED in NtMapViewOfSection.

---

 dlls/ntdll/virtual.c |   23 ++++++++++-------------
 1 file changed, 10 insertions(+), 13 deletions(-)

diff --git a/dlls/ntdll/virtual.c b/dlls/ntdll/virtual.c
index 8d3539a..d9acac6 100644
--- a/dlls/ntdll/virtual.c
+++ b/dlls/ntdll/virtual.c
@@ -854,11 +854,10 @@ done:
  * The csVirtual section must be held by caller.
  */
 static NTSTATUS map_file_into_view( struct file_view *view, int fd, size_t start, size_t size,
-                                    off_t offset, unsigned int vprot, BOOL removable )
+                                    off_t offset, unsigned int vprot, int flags, BOOL removable )
 {
     void *ptr;
     int prot = VIRTUAL_GetUnixProt( vprot | VPROT_COMMITTED /* make sure it is accessible */ );
-    BOOL shared_write = (vprot & VPROT_WRITE) != 0;
 
     assert( start < view->size );
     assert( start + size <= view->size );
@@ -871,11 +870,9 @@ static NTSTATUS map_file_into_view( struct file_view *view, int fd, size_t start
     }
 
     /* only try mmap if media is not removable (or if we require write access) */
-    if (!removable || shared_write)
+    if (!removable || (flags & MAP_SHARED))
     {
-        int flags = MAP_FIXED | (shared_write ? MAP_SHARED : MAP_PRIVATE);
-
-        if (mmap( (char *)view->base + start, size, prot, flags, fd, offset ) != (void *)-1)
+        if (mmap( (char *)view->base + start, size, prot, flags | MAP_FIXED, fd, offset ) != (void *)-1)
             goto done;
 
         if ((errno == EPERM) && (prot & PROT_EXEC))
@@ -885,7 +882,7 @@ static NTSTATUS map_file_into_view( struct file_view *view, int fd, size_t start
         /* page-aligned (EINVAL), or because the underlying filesystem */
         /* does not support mmap() (ENOEXEC,ENODEV), we do it by hand. */
         if ((errno != ENOEXEC) && (errno != EINVAL) && (errno != ENODEV)) return FILE_GetNtStatus();
-        if (shared_write)  /* we cannot fake shared write mappings */
+        if (flags & MAP_SHARED)  /* we cannot fake shared mappings */
         {
             if (errno == EINVAL) return STATUS_INVALID_PARAMETER;
             ERR( "shared writable mmap not supported, broken filesystem?\n" );
@@ -1097,7 +1094,7 @@ static NTSTATUS map_image( HANDLE hmapping, int fd, char *base, SIZE_T total_siz
     if (!st.st_size) goto error;
     header_size = min( header_size, st.st_size );
     if (map_file_into_view( view, fd, 0, header_size, 0, VPROT_COMMITTED | VPROT_READ | VPROT_WRITECOPY,
-                            !dup_mapping ) != STATUS_SUCCESS) goto error;
+                            MAP_PRIVATE, !dup_mapping ) != STATUS_SUCCESS) goto error;
     dos = (IMAGE_DOS_HEADER *)ptr;
     nt = (IMAGE_NT_HEADERS *)(ptr + dos->e_lfanew);
     header_end = ptr + ROUND_SIZE( 0, header_size );
@@ -1122,7 +1119,7 @@ static NTSTATUS map_image( HANDLE hmapping, int fd, char *base, SIZE_T total_siz
         /* in that case Windows simply maps in the whole file */
 
         if (map_file_into_view( view, fd, 0, total_size, 0, VPROT_COMMITTED | VPROT_READ,
-                                !dup_mapping ) != STATUS_SUCCESS) goto error;
+                                MAP_PRIVATE, !dup_mapping ) != STATUS_SUCCESS) goto error;
 
         /* check that all sections are loaded at the right offset */
         if (nt->OptionalHeader.FileAlignment != nt->OptionalHeader.SectionAlignment) goto error;
@@ -1176,7 +1173,7 @@ static NTSTATUS map_image( HANDLE hmapping, int fd, char *base, SIZE_T total_siz
                             sec->Characteristics );
             if (map_file_into_view( view, shared_fd, sec->VirtualAddress, map_size, pos,
                                     VPROT_COMMITTED | VPROT_READ | VPROT_WRITE,
-                                    FALSE ) != STATUS_SUCCESS)
+                                    MAP_SHARED, FALSE ) != STATUS_SUCCESS)
             {
                 ERR_(module)( "Could not map shared section %.8s\n", sec->Name );
                 goto error;
@@ -1193,7 +1190,7 @@ static NTSTATUS map_image( HANDLE hmapping, int fd, char *base, SIZE_T total_siz
                     map_file_into_view( view, shared_fd, base, end - base,
                                         pos + (base - sec->VirtualAddress),
                                         VPROT_COMMITTED | VPROT_READ | VPROT_WRITECOPY,
-                                        FALSE );
+                                        MAP_PRIVATE, FALSE );
             }
             pos += map_size;
             continue;
@@ -1215,7 +1212,7 @@ static NTSTATUS map_image( HANDLE hmapping, int fd, char *base, SIZE_T total_siz
             end < file_start ||
             map_file_into_view( view, fd, sec->VirtualAddress, file_size, file_start,
                                 VPROT_COMMITTED | VPROT_READ | VPROT_WRITECOPY,
-                                !dup_mapping ) != STATUS_SUCCESS)
+                                MAP_PRIVATE, !dup_mapping ) != STATUS_SUCCESS)
         {
             ERR_(module)( "Could not map section %.8s, file probably truncated\n", sec->Name );
             goto error;
@@ -2630,7 +2627,7 @@ NTSTATUS WINAPI NtMapViewOfSection( HANDLE handle, HANDLE process, PVOID *addr_p
     TRACE("handle=%p size=%lx offset=%x%08x\n",
           handle, size, offset.u.HighPart, offset.u.LowPart );
 
-    res = map_file_into_view( view, unix_handle, 0, size, offset.QuadPart, vprot, !dup_mapping );
+    res = map_file_into_view( view, unix_handle, 0, size, offset.QuadPart, vprot, MAP_SHARED, !dup_mapping );
     if (res == STATUS_SUCCESS)
     {
         *addr_ptr = view->base;




More information about the wine-cvs mailing list