From c583953b95cddcb8d2712b9d2312681b9c371ab3 Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Tue, 3 Oct 2017 11:59:20 +0200 Subject: [PATCH] server: Use the correct process when looking for a mapped dll. Signed-off-by: Alexandre Julliard --- server/debugger.c | 18 ++++++++++++++---- server/file.h | 4 ++-- server/mapping.c | 15 +++++---------- 3 files changed, 21 insertions(+), 16 deletions(-) diff --git a/server/debugger.c b/server/debugger.c index 37f19347bb6..79b7e527f33 100644 --- a/server/debugger.c +++ b/server/debugger.c @@ -147,6 +147,7 @@ static int fill_create_process_event( struct debug_event *event, const void *arg struct process *process = thread->process; struct process_dll *exe_module = get_process_exe_module( process ); const client_ptr_t *entry = arg; + struct file *file; obj_handle_t handle; /* documented: PROCESS_VM_READ | PROCESS_VM_WRITE */ @@ -170,8 +171,12 @@ static int fill_create_process_event( struct debug_event *event, const void *arg event->data.create_process.unicode = 1; /* 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 ); + if ((file = get_mapping_file( process, exe_module->base, GENERIC_READ, + FILE_SHARE_READ | FILE_SHARE_WRITE ))) + { + event->data.create_process.file = alloc_handle( debugger, file, GENERIC_READ, 0 ); + release_object( file ); + } return 1; } @@ -191,8 +196,10 @@ static int fill_exit_process_event( struct debug_event *event, const void *arg ) static int fill_load_dll_event( struct debug_event *event, const void *arg ) { + struct process *process = event->sender->process; struct process *debugger = event->debugger->process; const struct process_dll *dll = arg; + struct file *file; event->data.load_dll.handle = 0; event->data.load_dll.base = dll->base; @@ -200,8 +207,11 @@ 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; - event->data.load_dll.handle = open_mapping_file( debugger, dll->base, GENERIC_READ, - FILE_SHARE_READ | FILE_SHARE_WRITE ); + if ((file = get_mapping_file( process, dll->base, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE ))) + { + event->data.load_dll.handle = alloc_handle( debugger, file, GENERIC_READ, 0 ); + release_object( file ); + } return 1; } diff --git a/server/file.h b/server/file.h index 403da6526fb..31946cc76c0 100644 --- a/server/file.h +++ b/server/file.h @@ -149,8 +149,8 @@ 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, client_ptr_t base, - unsigned int access, unsigned int sharing ); +extern struct file *get_mapping_file( struct process *process, client_ptr_t base, + unsigned int access, unsigned int sharing ); extern void free_mapped_views( struct process *process ); extern int get_page_size(void); diff --git a/server/mapping.c b/server/mapping.c index 0e4143f80ca..096c15e136e 100644 --- a/server/mapping.c +++ b/server/mapping.c @@ -733,19 +733,14 @@ struct mapping *get_mapping_obj( struct process *process, obj_handle_t handle, u return (struct mapping *)get_handle_obj( process, handle, access, &mapping_ops ); } -/* open a new file handle to the file backing the mapping */ -obj_handle_t open_mapping_file( struct process *process, client_ptr_t base, - unsigned int access, unsigned int sharing ) +/* open a new file for the file descriptor backing the mapping */ +struct file *get_mapping_file( struct process *process, client_ptr_t base, + unsigned int access, unsigned int sharing ) { - obj_handle_t handle; struct memory_view *view = find_mapped_view( process, base ); - struct file *file; - 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; + if (!view || !view->fd) return NULL; + return create_file_for_fd_obj( view->fd, access, sharing ); } static void mapping_dump( struct object *obj, int verbose ) -- 2.11.4.GIT