From 338137221c8bd89f6d611c0cd3bf7b8a85d02517 Mon Sep 17 00:00:00 2001 From: Alexander Færøy Date: Thu, 22 Nov 2018 18:14:03 +0100 Subject: Make sure we call process_notify_event_exit() as the last thing in different callbacks. This patch makes sure that we call process_notify_event_exit() after we have done any modifications we need to do to the state of a process_t. This allows application developers to call process_free() in the exit_callback of the process. See: https://bugs.torproject.org/28179 --- src/lib/process/process_unix.c | 10 +++++++--- src/lib/process/process_win32.c | 7 +++++-- 2 files changed, 12 insertions(+), 5 deletions(-) (limited to 'src/lib') diff --git a/src/lib/process/process_unix.c b/src/lib/process/process_unix.c index fa03fdbbe4..4f46bbd888 100644 --- a/src/lib/process/process_unix.c +++ b/src/lib/process/process_unix.c @@ -549,12 +549,16 @@ process_unix_waitpid_callback(int status, void *data) process_t *process = data; process_unix_t *unix_process = process_get_unix_process(process); - /* Notify our process. */ - process_notify_event_exit(process, status); - /* Remove our waitpid callback. */ clear_waitpid_callback(unix_process->waitpid); unix_process->waitpid = NULL; + + /* Notify our process. */ + process_notify_event_exit(process, status); + + /* Make sure you don't modify the process after we have called + * process_notify_event_exit() on it, to allow users to process_free() it in + * the exit callback. */ } /** This function sets the file descriptor in the handle as non-blocking diff --git a/src/lib/process/process_win32.c b/src/lib/process/process_win32.c index 3e97f37801..7422493deb 100644 --- a/src/lib/process/process_win32.c +++ b/src/lib/process/process_win32.c @@ -445,12 +445,15 @@ process_win32_timer_callback(periodic_timer_t *timer, void *data) tor_assert(data == NULL); log_debug(LD_PROCESS, "Windows Process I/O timer ticked"); + + /* Move the process into an alertable state. */ + process_win32_trigger_completion_callbacks(); + + /* Check if our processes are still alive. */ const smartlist_t *processes = process_get_all_processes(); SMARTLIST_FOREACH(processes, process_t *, p, process_win32_timer_test_process(p)); - - process_win32_trigger_completion_callbacks(); } /** Test whether a given process is still alive. Notify the Process subsystem -- cgit v1.2.3-54-g00ecf