commit 93359ec74a12c2604acea8046eb8a37d2605951a
parent 9f32b9b69d46df1f0aca5dd585b67c4a390d20c3
Author: David Goulet <dgoulet@torproject.org>
Date: Tue, 3 Dec 2024 10:16:26 -0500
process: Don't close all FDs on new spawn
Fixes #40990
Signed-off-by: David Goulet <dgoulet@torproject.org>
Diffstat:
2 files changed, 8 insertions(+), 22 deletions(-)
diff --git a/changes/ticket40990 b/changes/ticket40990
@@ -0,0 +1,4 @@
+ o Minor bugfix (process):
+ - Avoid closing all possible FDs when spawning a process (PT). On some systems, this could
+ lead to 3+ minutes hang. Fixes bug 40990; bugfix on 0.3.5.1-alpha.
+
diff --git a/src/lib/process/process_unix.c b/src/lib/process/process_unix.c
@@ -130,14 +130,12 @@ process_unix_free_(process_unix_t *unix_process)
process_status_t
process_unix_exec(process_t *process)
{
- static int max_fd = -1;
-
process_unix_t *unix_process;
pid_t pid;
int stdin_pipe[2];
int stdout_pipe[2];
int stderr_pipe[2];
- int retval, fd;
+ int retval;
unix_process = process_get_unix_process(process);
@@ -189,20 +187,6 @@ process_unix_exec(process_t *process)
return PROCESS_STATUS_ERROR;
}
-#ifdef _SC_OPEN_MAX
- if (-1 == max_fd) {
- max_fd = (int)sysconf(_SC_OPEN_MAX);
-
- if (max_fd == -1) {
- max_fd = DEFAULT_MAX_FD;
- log_warn(LD_PROCESS,
- "Cannot find maximum file descriptor, assuming: %d", max_fd);
- }
- }
-#else /* !defined(_SC_OPEN_MAX) */
- max_fd = DEFAULT_MAX_FD;
-#endif /* defined(_SC_OPEN_MAX) */
-
pid = fork();
if (0 == pid) {
@@ -240,11 +224,9 @@ process_unix_exec(process_t *process)
close(stdin_pipe[0]);
close(stdin_pipe[1]);
- /* Close all other fds, including the read end of the pipe. XXX: We should
- * now be doing enough FD_CLOEXEC setting to make this needless.
- */
- for (fd = STDERR_FILENO + 1; fd < max_fd; fd++)
- close(fd);
+ /* Note that we don't close all FDs from here, which we used to do, because
+ * all our open are CLOEXEC. With a very large maximum number of FDs, the
+ * loop was taking a long time: #40990 */
/* Create the argv value for our new process. */
char **argv = process_get_argv(process);