diff options
author | Jeremy Harris <jgh146exb@wizmail.org> | 2020-03-08 20:26:19 +0000 |
---|---|---|
committer | Jeremy Harris <jgh146exb@wizmail.org> | 2020-03-08 20:26:19 +0000 |
commit | 8cfc4d82fc84825b3a673aa140fc561042e32b70 (patch) | |
tree | a4b3a39cb5d66e6b70417d447b988d64a6205721 | |
parent | 46473d31e2aa9db8aeff247667fe0b3770573a6d (diff) |
Close notifier socket before re-exec of daemon. Bug 2539
-rw-r--r-- | src/src/daemon.c | 24 |
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; |