tidying 4.next
authorJeremy Harris <jgh146exb@wizmail.org>
Mon, 1 Jul 2024 07:18:51 +0000 (08:18 +0100)
committerJeremy Harris <jgh146exb@wizmail.org>
Tue, 9 Jul 2024 14:17:51 +0000 (15:17 +0100)
src/src/daemon.c
src/src/deliver.c
src/src/transports/smtp.c

index 16137f9f61fbb62ee693a63fa9940c6a7764bae3..f3c49e25e5d25073d6be82f17b567f644602ed20 100644 (file)
@@ -324,7 +324,8 @@ if (smtp_accept_max_per_host)
 tedious per host_address checks. Note that at this stage smtp_accept_count
 contains the count of *other* connections, not including this one. */
 
-if (max_for_this_host > 0 && smtp_accept_count >= max_for_this_host)
+if (  smtp_slots
+   && max_for_this_host > 0 && smtp_accept_count >= max_for_this_host)
   {
   int host_accept_count = 0;
   int other_host_count = 0;    /* keep a count of non matches to optimise */
@@ -392,9 +393,9 @@ if (pid == 0)
   arrange to unset the selector in the subprocess.
 
   jgh 2023/08/08 :- moved this logging in from the parent process, just
-  pre-fork.  There was a claim back from 2004 that smtp_accept_count could have
-  become out-of-date by the time the child could log it, and I can't see how
-  that could happen. */
+  pre-fork.  There was a claim back from 4.21 (when it was moved from
+  smtp_start_session()) that smtp_accept_count could have become out-of-date by
+  the time the child could log it, and I can't see how that could happen. */
 
   if (LOGGING(smtp_connection))
     {
@@ -404,7 +405,8 @@ if (pid == 0)
       save_log_selector &= ~L_smtp_connection;
     else if (LOGGING(connection_id))
       log_write(L_smtp_connection, LOG_MAIN, "SMTP connection from %Y "
-       "Ci=%lu (TCP/IP connection count = %d)", whofrom, connection_id, smtp_accept_count);
+       "Ci=%lu (TCP/IP connection count = %d)",
+       whofrom, connection_id, smtp_accept_count);
     else
       log_write(L_smtp_connection, LOG_MAIN, "SMTP connection from %Y "
        "(TCP/IP connection count = %d)", whofrom, smtp_accept_count);
@@ -752,7 +754,7 @@ remember the pid for ticking off when the child completes. */
 
 if (pid < 0)
   never_error(US"daemon: accept process fork failed", US"Fork failed", errno);
-else
+else if (smtp_slots)
   {
   for (int i = 0; i < smtp_accept_max; ++i)
     if (smtp_slots[i].pid <= 0)
@@ -912,12 +914,13 @@ while ((pid = waitpid(-1, &status, WNOHANG)) > 0)
   if (smtp_slots)
     {
     int i;
-    for (i = 0; i < smtp_accept_max; i++)
-      if (smtp_slots[i].pid == pid)
+    smtp_slot * sp;
+    for (i = 0, sp = smtp_slots; i < smtp_accept_max; i++, sp++)
+      if (sp->pid == pid)
         {
-        if (smtp_slots[i].host_address)
-          store_free(smtp_slots[i].host_address);
-        smtp_slots[i] = empty_smtp_slot;
+        if (sp->host_address)
+          store_free(sp->host_address);
+        *sp = empty_smtp_slot;
         if (--smtp_accept_count < 0) smtp_accept_count = 0;
         DEBUG(D_any) debug_printf("%d SMTP accept process%s now running\n",
           smtp_accept_count, smtp_accept_count == 1 ? "" : "es");
index b828f8094346ec5b3a13459b79511990642ace3f..33d833389aadb20740f536d09af15b2a3d114962 100644 (file)
@@ -3660,16 +3660,20 @@ while (!done)
            h->dnssec = *ptr == '2' ? DS_YES
                      : *ptr == '1' ? DS_NO
                      : DS_UNK;
-           ptr++;
            addr->host_used = h;
            }
-         else ptr++;
+         ptr++;
 
          continue_flags = 0;
+#ifndef DISABLE_TLS
          if (testflag(addr, af_cert_verified)) continue_flags |= CTF_CV;
+# ifdef SUPPORT_DANE
          if (testflag(addr, af_dane_verified)) continue_flags |= CTF_DV;
+# endif
+# ifndef DISABLE_TLS_RESUME
          if (testflag(addr, af_tls_resume))    continue_flags |= CTF_TR;
-
+# endif
+#endif
          /* Finished with this address */
 
          addr = addr->next;
@@ -4912,17 +4916,17 @@ do_remote_deliveries par_reduce par_wait par_read_pipe
       {
       uschar * ptr;
 
+#ifndef DISABLE_TLS
       /* The certificate verification status goes into the flags, in A0 */
       if (tls_out.certificate_verified) setflag(addr, af_cert_verified);
-#ifdef SUPPORT_DANE
+# ifdef SUPPORT_DANE
       if (tls_out.dane_verified)        setflag(addr, af_dane_verified);
-#endif
-#ifndef DISABLE_TLS_RESUME
+# endif
+# ifndef DISABLE_TLS_RESUME
       if (tls_out.resumption & RESUME_USED) setflag(addr, af_tls_resume);
-#endif
+# endif
 
       /* Use an X item only if there's something to send */
-#ifndef DISABLE_TLS
       if (addr->cipher)
         {
         ptr = big_buffer + sprintf(CS big_buffer, "%.128s", addr->cipher) + 1;
index 5d50715d66d97d74287c909e05815d86ae7c5f88..3780f5ca929b4a84ebde3643b1d6916c9d6570f5 100644 (file)
@@ -4558,10 +4558,11 @@ if (!sx->ok)
 
       case ERRNO_SMTPCLOSED:
        /* If the peer closed the TCP connection after end-of-data, but before
-       we could send QUIT, do TLS close, etc - call it a message error.
-       Otherwise, if all the recipients have been dealt with, call a close no
-       error at all; each address_item should have a suitable result already
-       (2xx: PENDING_OK, 4xx: DEFER, 5xx: FAIL) */
+       we could send QUIT, do TLS close, etc - it is a message error.
+       If not, and all the recipients have been dealt with, call such a close
+       no error at all; each address_item should have a suitable result already
+       (2xx: PENDING_OK, 4xx: DEFER, 5xx: FAIL).
+       Otherwise, it is a non-message error. */
 
        if (!(message_error = Ustrncmp(smtp_command,"end ",4) == 0))
          {