[dovecot-cvs] dovecot/src/master auth-process.c,1.14,1.15 auth-process.h,1.3,1.4 login-process.c,1.15,1.16 login-process.h,1.3,1.4 main.c,1.14,1.15

cras at procontrol.fi cras at procontrol.fi
Sun Dec 1 17:39:23 EET 2002


Update of /home/cvs/dovecot/src/master
In directory danu:/tmp/cvs-serv1500/src/master

Modified Files:
	auth-process.c auth-process.h login-process.c login-process.h 
	main.c 
Log Message:
We use close-on-exec flag now to make sure that master process closes the
fds when executing other processes.



Index: auth-process.c
===================================================================
RCS file: /home/cvs/dovecot/src/master/auth-process.c,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -d -r1.14 -r1.15
--- auth-process.c	1 Dec 2002 13:50:45 -0000	1.14
+++ auth-process.c	1 Dec 2002 15:39:21 -0000	1.15
@@ -3,6 +3,7 @@
 #include "common.h"
 #include "ioloop.h"
 #include "env-util.h"
+#include "fd-close-on-exec.h"
 #include "network.h"
 #include "obuffer.h"
 #include "restrict-access.h"
@@ -171,13 +172,12 @@
 	const char *path;
 	struct passwd *pwd;
 	pid_t pid;
-	int fd[2], listen_fd;
+	int fd[2], listen_fd, i;
 
 	if ((pwd = getpwnam(config->user)) == NULL)
 		i_fatal("Auth user doesn't exist: %s", config->user);
 
-	/* create communication to process with a socket pair
-	   FIXME: pipe() would work as well, would it be better? */
+	/* create communication to process with a socket pair */
 	if (socketpair(AF_UNIX, SOCK_STREAM, 0, fd) == -1) {
 		i_error("socketpair() failed: %m");
 		return -1;
@@ -193,6 +193,7 @@
 
 	if (pid != 0) {
 		/* master */
+		fd_close_on_exec(fd[0], TRUE);
 		auth_process_new(pid, fd[0], config->name);
 		(void)close(fd[1]);
 		return pid;
@@ -235,6 +236,9 @@
 		(void)close(listen_fd);
 	}
 
+	for (i = 0; i <= 2; i++)
+		fd_close_on_exec(i, FALSE);
+
 	/* setup access environment - needs to be done after
 	   clean_child_process() since it clears environment */
 	restrict_access_set_env(config->user, pwd->pw_uid, pwd->pw_gid,
@@ -298,14 +302,6 @@
 	}
 
 	return count;
-}
-
-void auth_processes_cleanup(void)
-{
-	AuthProcess *p;
-
-	for (p = processes; p != NULL; p = p->next)
-		(void)close(p->fd);
 }
 
 void auth_processes_destroy_all(void)

Index: auth-process.h
===================================================================
RCS file: /home/cvs/dovecot/src/master/auth-process.h,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- auth-process.h	20 Nov 2002 19:20:23 -0000	1.3
+++ auth-process.h	1 Dec 2002 15:39:21 -0000	1.4
@@ -16,7 +16,6 @@
 			  AuthCallback callback, void *context);
 
 /* Close any fds used by auth processes */
-void auth_processes_cleanup(void);
 void auth_processes_destroy_all(void);
 
 void auth_processes_init(void);

Index: login-process.c
===================================================================
RCS file: /home/cvs/dovecot/src/master/login-process.c,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -d -r1.15 -r1.16
--- login-process.c	1 Dec 2002 13:48:50 -0000	1.15
+++ login-process.c	1 Dec 2002 15:39:21 -0000	1.16
@@ -5,6 +5,7 @@
 #include "network.h"
 #include "obuffer.h"
 #include "fdpass.h"
+#include "fd-close-on-exec.h"
 #include "env-util.h"
 #include "restrict-access.h"
 #include "restrict-process-size.h"
@@ -266,6 +267,7 @@
 
 	if (pid != 0) {
 		/* master */
+		fd_close_on_exec(fd[0], TRUE);
 		login_process_new(pid, fd[0]);
 		(void)close(fd[1]);
 		return pid;
@@ -274,14 +276,17 @@
 	/* move communication handle */
 	if (dup2(fd[1], LOGIN_MASTER_SOCKET_FD) < 0)
 		i_fatal("login: dup2() failed: %m");
+	fd_close_on_exec(LOGIN_MASTER_SOCKET_FD, FALSE);
 
 	/* move the listen handle */
 	if (dup2(imap_fd, LOGIN_IMAP_LISTEN_FD) < 0)
 		i_fatal("login: dup2() failed: %m");
+	fd_close_on_exec(LOGIN_IMAP_LISTEN_FD, FALSE);
 
 	/* move the SSL listen handle */
 	if (dup2(imaps_fd, LOGIN_IMAPS_LISTEN_FD) < 0)
 		i_fatal("login: dup2() failed: %m");
+	fd_close_on_exec(LOGIN_IMAPS_LISTEN_FD, FALSE);
 
 	/* imap_fd and imaps_fd are closed by clean_child_process() */
 
@@ -338,19 +343,6 @@
 	/* don't start raising the process count if they're dying all
 	   the time */
 	wanted_processes_count = 0;
-}
-
-static void login_hash_cleanup(void *key __attr_unused__, void *value,
-			       void *context __attr_unused__)
-{
-	LoginProcess *p = value;
-
-	(void)close(p->fd);
-}
-
-void login_processes_cleanup(void)
-{
-	hash_foreach(processes, login_hash_cleanup, NULL);
 }
 
 static void login_hash_destroy(void *key __attr_unused__, void *value,

Index: login-process.h
===================================================================
RCS file: /home/cvs/dovecot/src/master/login-process.h,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- login-process.h	20 Nov 2002 19:20:23 -0000	1.3
+++ login-process.h	1 Dec 2002 15:39:21 -0000	1.4
@@ -2,7 +2,6 @@
 #define __CHILD_LOGIN_H
 
 void login_process_abormal_exit(pid_t pid);
-void login_processes_cleanup(void);
 void login_processes_destroy_all(void);
 
 void login_processes_init(void);

Index: main.c
===================================================================
RCS file: /home/cvs/dovecot/src/master/main.c,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -d -r1.14 -r1.15
--- main.c	26 Nov 2002 19:49:06 -0000	1.14
+++ main.c	1 Dec 2002 15:39:21 -0000	1.15
@@ -5,6 +5,7 @@
 #include "lib-signals.h"
 #include "network.h"
 #include "env-util.h"
+#include "fd-close-on-exec.h"
 
 #include "auth-process.h"
 #include "login-process.h"
@@ -56,14 +57,6 @@
 	if (set_log_timestamp != NULL)
 		env_put(t_strconcat("IMAP_LOGSTAMP=", set_log_timestamp, NULL));
 
-	(void)close(null_fd);
-	(void)close(imap_fd);
-	(void)close(imaps_fd);
-
-	/* close fds for auth/login processes */
-	login_processes_cleanup();
-        auth_processes_cleanup();
-
 	closelog();
 }
 
@@ -156,11 +149,13 @@
 	null_fd = open("/dev/null", O_RDONLY);
 	if (null_fd == -1)
 		i_fatal("Can't open /dev/null: %m");
+	fd_close_on_exec(null_fd, TRUE);
 
 	imap_fd = set_imap_port == 0 ? dup(null_fd) :
 		net_listen(imap_ip, &set_imap_port);
 	if (imap_fd == -1)
 		i_fatal("listen(%d) failed: %m", set_imap_port);
+	fd_close_on_exec(imap_fd, TRUE);
 
 #ifdef HAVE_SSL
 	imaps_fd = set_ssl_cert_file == NULL || *set_ssl_cert_file == '\0' ||
@@ -172,6 +167,7 @@
 #endif
 	if (imaps_fd == -1)
 		i_fatal("listen(%d) failed: %m", set_imaps_port);
+	fd_close_on_exec(imaps_fd, TRUE);
 }
 
 static void main_init(void)




More information about the dovecot-cvs mailing list