[tor-commits] [tor/release-0.4.2] Ensure that the exit callback is called if CreateProcessA() fails on Windows.

nickm at torproject.org nickm at torproject.org
Fri Oct 18 16:32:55 UTC 2019


commit 7a64f6ea049747385acf77985ad4df5fa497b3e1
Author: Alexander Færøy <ahf at torproject.org>
Date:   Thu Oct 17 16:47:04 2019 +0200

    Ensure that the exit callback is called if CreateProcessA() fails on Windows.
    
    This patch fixes an issue where the exit handler is not called for the
    given process_t in case CreateProcessA() fails. This could, for example,
    happen if the user tries to execute a binary that does not exist.
    
    See: https://bugs.torproject.org/31810
---
 src/lib/process/process_win32.c | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)

diff --git a/src/lib/process/process_win32.c b/src/lib/process/process_win32.c
index 624333d4a..7e4082ad1 100644
--- a/src/lib/process/process_win32.c
+++ b/src/lib/process/process_win32.c
@@ -234,6 +234,24 @@ process_win32_exec(process_t *process)
     CloseHandle(stdin_pipe_read);
     CloseHandle(stdin_pipe_write);
 
+    /* In the Unix backend, we do not get an error in the Tor process when a
+     * child process fails to spawn its target executable since we need to
+     * first do the fork() call in the Tor process and then the child process
+     * is responsible for doing the call to execve().
+     *
+     * This means that the user of the process_exec() API must check for
+     * whether it returns PROCESS_STATUS_ERROR, which will rarely happen on
+     * Unix, but will happen for error cases on Windows where it does not
+     * happen on Unix. For example: when the target executable does not exist
+     * on the file system.
+     *
+     * To have somewhat feature compatibility between the Unix and the Windows
+     * backend, we here notify the process_t owner that the process have exited
+     * (even though it never managed to run) to ensure that the exit callback
+     * is executed.
+     */
+    process_notify_event_exit(process, 0);
+
     return PROCESS_STATUS_ERROR;
   }
 





More information about the tor-commits mailing list