diff options
author | teor <teor@torproject.org> | 2019-12-05 10:13:15 +1000 |
---|---|---|
committer | teor <teor@torproject.org> | 2019-12-05 10:13:15 +1000 |
commit | 46057ec5ae5ecc183fb7ed5060b8ba07ad235fb3 (patch) | |
tree | bb9a420306d4a1ceffe07aa88951f20f63287785 /src/lib | |
parent | febbc236d4a813bf086c5cc3dcd0fa93c7f3eab1 (diff) | |
parent | ee8db8a2eb7a5d345d16d02bade593fa6db2877e (diff) | |
download | tor-46057ec5ae5ecc183fb7ed5060b8ba07ad235fb3.tar.gz tor-46057ec5ae5ecc183fb7ed5060b8ba07ad235fb3.zip |
Merge remote-tracking branch 'tor-github/pr/1424' into maint-0.4.0
Diffstat (limited to 'src/lib')
-rw-r--r-- | src/lib/process/process_unix.c | 9 | ||||
-rw-r--r-- | src/lib/process/process_win32.c | 18 |
2 files changed, 19 insertions, 8 deletions
diff --git a/src/lib/process/process_unix.c b/src/lib/process/process_unix.c index 790ab897e9..b102afff44 100644 --- a/src/lib/process/process_unix.c +++ b/src/lib/process/process_unix.c @@ -253,22 +253,15 @@ process_unix_exec(process_t *process) process_environment_t *env = process_get_environment(process); /* Call the requested program. */ - retval = execve(argv[0], argv, env->unixoid_environment_block); + execve(argv[0], argv, env->unixoid_environment_block); /* If we made it here it is because execve failed :-( */ - if (-1 == retval) - fprintf(stderr, "Call to execve() failed: %s", strerror(errno)); - tor_free(argv); process_environment_free(env); - tor_assert_unreached(); - error: - /* LCOV_EXCL_START */ fprintf(stderr, "Error from child process: %s", strerror(errno)); _exit(1); - /* LCOV_EXCL_STOP */ } /* We are in the parent process. */ diff --git a/src/lib/process/process_win32.c b/src/lib/process/process_win32.c index ddbe76bfd9..1b1de6ad55 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; } |