Fix daemon startup. Bug 2930
authorJeremy Harris <jgh146exb@wizmail.org>
Thu, 3 Nov 2022 20:08:25 +0000 (20:08 +0000)
committerJeremy Harris <jgh146exb@wizmail.org>
Thu, 3 Nov 2022 21:10:58 +0000 (21:10 +0000)
Broken-by: 7d5055276a
doc/doc-txt/ChangeLog
src/src/daemon.c

index 2ca0f7e00db532379923f0b8dc4952fe0b3f2bf8..3942e25f0f7b349c4791f65696707ca29863f7ec 100644 (file)
@@ -50,6 +50,10 @@ JH/11 OpenSSL: fix for ancient clients needing TLS support for versions earlier
 HS/01 Bug 2728: Introduce EDITME option "DMARC_API" to work around incompatible
       API changes in libopendmarc.
 
+JH/12 Bug 2930: Fix daemon startup.  When started from any process apart from
+      pid 1, in the normal "background daemon" mode, having to drop process-
+      group leadership also lost track of needing to create listener sockets.
+
 
 Exim version 4.96
 -----------------
index 54725e07d9ba4f74e3f442f89aeaa657681bfe84..8446f81cb721a8b8613e7d63091733d860709516 100644 (file)
@@ -1776,15 +1776,19 @@ if (f.background_daemon)
   daemon as the result of a SIGHUP. In this case, there is no need to do
   anything, because the controlling terminal has long gone. Otherwise, fork, in
   case current process is a process group leader (see 'man setsid' for an
-  explanation) before calling setsid(). */
+  explanation) before calling setsid().
+  All other forks want daemon_listen cleared. Rather than blow a register, jsut
+  restore it here. */
 
   if (getppid() != 1)
     {
+    BOOL daemon_listen = f.daemon_listen;
     pid_t pid = exim_fork(US"daemon");
     if (pid < 0) log_write(0, LOG_MAIN|LOG_PANIC_DIE,
       "fork() failed when starting daemon: %s", strerror(errno));
     if (pid > 0) exit(EXIT_SUCCESS);      /* in parent process, just exit */
     (void)setsid();                       /* release controlling terminal */
+    f.daemon_listen = daemon_listen;
     }
   }
 
@@ -2122,7 +2126,7 @@ else if (f.daemon_listen)
              if (*--p == '}') *p = '\0';       /* drop EOL */
              while (isdigit(*--p)) ;           /* char before port */
 
-             i2->log = *p == ':'               /* no list yet? */
+             i2->log = *p == ':'               /* no list yet?     { */
                ? string_sprintf("%.*s{%s,%d}",
                  (int)(p - i2->log + 1), i2->log, p+1, ipa->port)
                : string_sprintf("%s,%d}", i2->log, ipa->port);