[tor-commits] [tor/master] Make sure we call process_notify_event_exit() as the last thing in different callbacks.

nickm at torproject.org nickm at torproject.org
Tue Dec 18 18:36:43 UTC 2018


commit 338137221c8bd89f6d611c0cd3bf7b8a85d02517
Author: Alexander Færøy <ahf at torproject.org>
Date:   Thu Nov 22 18:14:03 2018 +0100

    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(-)

diff --git a/src/lib/process/process_unix.c b/src/lib/process/process_unix.c
index fa03fdbbe..4f46bbd88 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 <b>handle</b> as non-blocking
diff --git a/src/lib/process/process_win32.c b/src/lib/process/process_win32.c
index 3e97f3780..7422493de 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





More information about the tor-commits mailing list