changeset 9465:19aee456cec3 HEAD

master: When creating login processes, don't close any fds after dup2()s.
author Timo Sirainen <tss@iki.fi>
date Thu, 05 Nov 2009 12:25:43 -0500
parents 939edf3ed09b
children 68af994e7f3c
files src/master/login-process.c
diffstat 1 files changed, 4 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/src/master/login-process.c	Mon Nov 02 17:54:17 2009 -0500
+++ b/src/master/login-process.c	Thu Nov 05 12:25:43 2009 -0500
@@ -648,6 +648,8 @@
 		i_error("socketpair() failed: %m");
 		return -1;
 	}
+	fd_close_on_exec(fd[0], TRUE);
+	fd_close_on_exec(fd[1], TRUE);
 
 	max_log_lines_per_sec =
 		group->set->login_process_per_connection ? 10 : 0;
@@ -675,7 +677,6 @@
 		log_set_pid(log, pid);
 
 		net_set_nonblock(fd[0], TRUE);
-		fd_close_on_exec(fd[0], TRUE);
 		(void)login_process_new(group, pid, fd[0], FALSE);
 		(void)close(fd[1]);
 		(void)close(log_fd);
@@ -715,14 +716,13 @@
 
 	if (dup2_array(&dups) < 0)
 		i_fatal("Failed to dup2() fds");
+	/* NOTE: don't close any fds below here. dup2_array() may have already
+	   assigned other fds to them. */
 
 	/* don't close any of these */
 	for (tmp_fd = 0; tmp_fd < cur_fd; tmp_fd++)
 		fd_close_on_exec(tmp_fd, FALSE);
 
-	(void)close(fd[0]);
-	(void)close(fd[1]);
-
 	login_process_init_env(group, getpid());
 
 	env_put(t_strdup_printf("LISTEN_FDS=%u", listen_count));