From d6683d637a2a1e333873cac51907327c09f92959 Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Mon, 24 Sep 2018 19:13:54 +0200 Subject: [PATCH] server: Store the process exe file in the process structure. Signed-off-by: Alexandre Julliard --- server/process.c | 31 ++++++++++++++----------------- server/process.h | 1 + 2 files changed, 15 insertions(+), 17 deletions(-) diff --git a/server/process.c b/server/process.c index 186912f6748..d4976262609 100644 --- a/server/process.c +++ b/server/process.c @@ -105,7 +105,6 @@ static const struct fd_ops process_fd_ops = struct startup_info { struct object obj; /* object header */ - struct file *exe_file; /* file handle for main exe */ struct process *process; /* created process */ data_size_t info_size; /* size of startup info */ data_size_t data_size; /* size of whole startup data */ @@ -513,6 +512,7 @@ struct process *create_process( int fd, struct thread *parent_thread, int inheri process->startup_state = STARTUP_IN_PROGRESS; process->startup_info = NULL; process->idle_event = NULL; + process->exe_file = NULL; process->peb = 0; process->ldt_copy = 0; process->dir_cache = NULL; @@ -617,6 +617,7 @@ static void process_destroy( struct object *obj ) if (process->msg_fd) release_object( process->msg_fd ); list_remove( &process->entry ); if (process->idle_event) release_object( process->idle_event ); + if (process->exe_file) release_object( process->exe_file ); if (process->id) free_ptid( process->id ); if (process->token) release_object( process->token ); free( process->dir_cache ); @@ -665,7 +666,6 @@ static void startup_info_destroy( struct object *obj ) struct startup_info *info = (struct startup_info *)obj; assert( obj->ops == &startup_info_ops ); free( info->data ); - if (info->exe_file) release_object( info->exe_file ); if (info->process) release_object( info->process ); } @@ -823,11 +823,10 @@ static void process_killed( struct process *process ) process->desktop = 0; close_process_handles( process ); cancel_process_asyncs( process ); - if (process->idle_event) - { - release_object( process->idle_event ); - process->idle_event = NULL; - } + if (process->idle_event) release_object( process->idle_event ); + if (process->exe_file) release_object( process->exe_file ); + process->idle_event = NULL; + process->exe_file = NULL; /* close the console attached to this process, if any */ free_console( process ); @@ -1129,17 +1128,9 @@ DECL_HANDLER(new_process) close( socket_fd ); return; } - info->exe_file = NULL; info->process = NULL; info->data = NULL; - if (req->exe_file && - !(info->exe_file = get_file_obj( current->process, req->exe_file, FILE_READ_DATA ))) - { - close( socket_fd ); - goto done; - } - info_ptr = get_req_data_after_objattr( objattr, &info->data_size ); info->info_size = min( req->info_size, info->data_size ); @@ -1185,6 +1176,10 @@ DECL_HANDLER(new_process) process->startup_info = (struct startup_info *)grab_object( info ); + if (req->exe_file && + !(process->exe_file = get_file_obj( current->process, req->exe_file, FILE_READ_DATA ))) + goto done; + if (parent->job && !(req->create_flags & CREATE_BREAKAWAY_FROM_JOB) && !(parent->job->limit_flags & JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK)) @@ -1266,8 +1261,8 @@ DECL_HANDLER(get_startup_info) if (!info) return; - if (info->exe_file && - !(reply->exe_file = alloc_handle( process, info->exe_file, GENERIC_READ, 0 ))) return; + if (process->exe_file && + !(reply->exe_file = alloc_handle( process, process->exe_file, GENERIC_READ, 0 ))) return; /* we return the data directly without making a copy so this can only be called once */ reply->info_size = info->info_size; @@ -1302,6 +1297,8 @@ DECL_HANDLER(init_process_done) process->ldt_copy = req->ldt_copy; process->start_time = current_time; current->entry_point = req->entry; + if (process->exe_file) release_object( process->exe_file ); + process->exe_file = NULL; generate_startup_debug_events( process, req->entry ); set_process_startup_state( process, STARTUP_DONE ); diff --git a/server/process.h b/server/process.h index ec4538851a0..a12d523246b 100644 --- a/server/process.h +++ b/server/process.h @@ -83,6 +83,7 @@ struct process enum startup_state startup_state; /* startup state */ struct startup_info *startup_info; /* startup info while init is in progress */ struct event *idle_event; /* event for input idle */ + struct file *exe_file; /* file handle for main exe (during startup only) */ obj_handle_t winstation; /* main handle to process window station */ obj_handle_t desktop; /* handle to desktop to use for new threads */ struct token *token; /* security token associated with this process */