Alexandre Julliard : server: Store the mapped file descriptor in the memory view.

Alexandre Julliard julliard at winehq.org
Tue Sep 26 14:56:16 CDT 2017


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Tue Sep 26 14:50:43 2017 +0200

server: Store the mapped file descriptor in the memory view.

Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 server/debugger.c |  9 ++++-----
 server/file.h     |  2 +-
 server/mapping.c  | 11 ++++++++---
 3 files changed, 13 insertions(+), 9 deletions(-)

diff --git a/server/debugger.c b/server/debugger.c
index 2eb794a..37f1934 100644
--- a/server/debugger.c
+++ b/server/debugger.c
@@ -169,9 +169,9 @@ static int fill_create_process_event( struct debug_event *event, const void *arg
     event->data.create_process.name       = exe_module->name;
     event->data.create_process.unicode    = 1;
 
-    if (exe_module->mapping)  /* the doc says write access too, but this doesn't seem a good idea */
-        event->data.create_process.file = open_mapping_file( debugger, exe_module->mapping, GENERIC_READ,
-                                                             FILE_SHARE_READ | FILE_SHARE_WRITE );
+    /* the doc says write access too, but this doesn't seem a good idea */
+    event->data.create_process.file = open_mapping_file( debugger, exe_module->base, GENERIC_READ,
+                                                         FILE_SHARE_READ | FILE_SHARE_WRITE );
     return 1;
 }
 
@@ -200,8 +200,7 @@ static int fill_load_dll_event( struct debug_event *event, const void *arg )
     event->data.load_dll.dbg_size   = dll->dbg_size;
     event->data.load_dll.name       = dll->name;
     event->data.load_dll.unicode    = 1;
-    if (dll->mapping)
-        event->data.load_dll.handle = open_mapping_file( debugger, dll->mapping, GENERIC_READ,
+    event->data.load_dll.handle     = open_mapping_file( debugger, dll->base, GENERIC_READ,
                                                          FILE_SHARE_READ | FILE_SHARE_WRITE );
     return 1;
 }
diff --git a/server/file.h b/server/file.h
index b67b749..512b03a 100644
--- a/server/file.h
+++ b/server/file.h
@@ -147,7 +147,7 @@ extern mode_t sd_to_mode( const struct security_descriptor *sd, const SID *owner
 
 extern struct mapping *get_mapping_obj( struct process *process, obj_handle_t handle,
                                         unsigned int access );
-extern obj_handle_t open_mapping_file( struct process *process, struct mapping *mapping,
+extern obj_handle_t open_mapping_file( struct process *process, client_ptr_t base,
                                        unsigned int access, unsigned int sharing );
 extern struct mapping *grab_mapping_unless_removable( struct mapping *mapping );
 extern void free_mapped_views( struct process *process );
diff --git a/server/mapping.c b/server/mapping.c
index a75438a..03cffd1 100644
--- a/server/mapping.c
+++ b/server/mapping.c
@@ -85,6 +85,7 @@ static const struct object_ops ranges_ops =
 struct memory_view
 {
     struct list     entry;           /* entry in per-process view list */
+    struct fd      *fd;              /* fd for mapped file */
     struct ranges  *committed;       /* list of committed ranges in this mapping */
     unsigned int    flags;           /* SEC_* flags */
     client_ptr_t    base;            /* view base address (in process addr space) */
@@ -259,6 +260,7 @@ static struct memory_view *find_mapped_view( struct process *process, client_ptr
 
 static void free_memory_view( struct memory_view *view )
 {
+    if (view->fd) release_object( view->fd );
     if (view->committed) release_object( view->committed );
     list_remove( &view->entry );
     free( view );
@@ -731,13 +733,15 @@ struct mapping *get_mapping_obj( struct process *process, obj_handle_t handle, u
 }
 
 /* open a new file handle to the file backing the mapping */
-obj_handle_t open_mapping_file( struct process *process, struct mapping *mapping,
+obj_handle_t open_mapping_file( struct process *process, client_ptr_t base,
                                 unsigned int access, unsigned int sharing )
 {
     obj_handle_t handle;
-    struct file *file = create_file_for_fd_obj( mapping->fd, access, sharing );
+    struct memory_view *view = find_mapped_view( process, base );
+    struct file *file;
 
-    if (!file) return 0;
+    if (!view || !view->fd) return 0;
+    if (!(file = create_file_for_fd_obj( view->fd, access, sharing ))) return 0;
     handle = alloc_handle( process, file, access, 0 );
     release_object( file );
     return handle;
@@ -925,6 +929,7 @@ DECL_HANDLER(map_view)
         view->size      = req->size;
         view->start     = req->start;
         view->flags     = mapping->flags;
+        view->fd        = !is_fd_removable( mapping->fd ) ? (struct fd *)grab_object( mapping->fd ) : NULL;
         view->committed = mapping->committed ? (struct ranges *)grab_object( mapping->committed ) : NULL;
         list_add_tail( &current->process->views, &view->entry );
     }




More information about the wine-cvs mailing list