summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy Harris <jgh146exb@wizmail.org>2020-03-08 20:26:19 +0000
committerJeremy Harris <jgh146exb@wizmail.org>2020-03-08 20:26:19 +0000
commit8cfc4d82fc84825b3a673aa140fc561042e32b70 (patch)
treea4b3a39cb5d66e6b70417d447b988d64a6205721
parent46473d31e2aa9db8aeff247667fe0b3770573a6d (diff)
Close notifier socket before re-exec of daemon. Bug 2539
-rw-r--r--src/src/daemon.c24
1 files changed, 17 insertions, 7 deletions
diff --git a/src/src/daemon.c b/src/src/daemon.c
index f39ab012d..ac507b023 100644
--- a/src/src/daemon.c
+++ b/src/src/daemon.c
@@ -127,6 +127,18 @@ if (smtp_out) smtp_printf("421 %s\r\n", FALSE, smtp_msg);
/*************************************************
+*************************************************/
+
+static void
+close_daemon_sockets(int daemon_notifier_fd,
+ int * listen_sockets, int listen_socket_count)
+{
+if (daemon_notifier_fd >= 0) (void) close(daemon_notifier_fd);
+for (int i = 0; i < listen_socket_count; i++) (void) close(listen_sockets[i]);
+}
+
+
+/*************************************************
* Handle a connected SMTP call *
*************************************************/
@@ -424,7 +436,7 @@ if (pid == 0)
extensive comment before the reception loop in exim.c for a fuller
explanation of this logic. */
- for (i = 0; i < listen_socket_count; i++) (void)close(listen_sockets[i]);
+ close_daemon_sockets(daemon_notifier_fd, listen_sockets, listen_socket_count);
/* Set FD_CLOEXEC on the SMTP socket. We don't want any rogue child processes
to be able to communicate with them, under any circumstances. */
@@ -2123,10 +2135,8 @@ for (;;)
/* Close any open listening sockets in the child */
- if (daemon_notifier_fd >= 0)
- (void) close(daemon_notifier_fd);
- for (int sk = 0; sk < listen_socket_count; sk++)
- (void) close(listen_sockets[sk]);
+ close_daemon_sockets(daemon_notifier_fd,
+ listen_sockets, listen_socket_count);
/* Reset SIGHUP and SIGCHLD in the child in both cases. */
@@ -2434,8 +2444,8 @@ for (;;)
{
log_write(0, LOG_MAIN, "pid %d: SIGHUP received: re-exec daemon",
getpid());
- for (int sk = 0; sk < listen_socket_count; sk++)
- (void)close(listen_sockets[sk]);
+ close_daemon_sockets(daemon_notifier_fd,
+ listen_sockets, listen_socket_count);
ALARM_CLR(0);
signal(SIGHUP, SIG_IGN);
sighup_argv[0] = exim_path;