Gitweb:
https://git.exim.org/exim.git/commitdiff/8cfc4d82fc84825b3a673aa140fc561042e32b70
Commit: 8cfc4d82fc84825b3a673aa140fc561042e32b70
Parent: 46473d31e2aa9db8aeff247667fe0b3770573a6d
Author: Jeremy Harris <jgh146exb@???>
AuthorDate: Sun Mar 8 20:26:19 2020 +0000
Committer: Jeremy Harris <jgh146exb@???>
CommitDate: Sun Mar 8 20:26:19 2020 +0000
Close notifier socket before re-exec of daemon. Bug 2539
---
src/src/daemon.c | 24 +++++++++++++++++-------
1 file changed, 17 insertions(+), 7 deletions(-)
diff --git a/src/src/daemon.c b/src/src/daemon.c
index f39ab01..ac507b0 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;