Copyright updates:
[exim.git] / src / src / spool_in.c
index 101a6c40cfb94245f3869a806e1383d0b996c25a..a0147d5eed1d540eb80d88638672eb2f765a8f89 100644 (file)
@@ -3,6 +3,7 @@
 *************************************************/
 
 /* Copyright (c) University of Cambridge 1995 - 2018 */
 *************************************************/
 
 /* Copyright (c) University of Cambridge 1995 - 2018 */
+/* Copyright (c) The Exim Maintainers 2020 */
 /* See the file NOTICE for conditions of use and distribution. */
 
 /* Functions for reading spool files. When compiling for a utility (eximon),
 /* See the file NOTICE for conditions of use and distribution. */
 
 /* Functions for reading spool files. When compiling for a utility (eximon),
@@ -52,7 +53,7 @@ for (int i = 0; i < 2; i++)
   uschar * fname;
   int save_errno;
 
   uschar * fname;
   int save_errno;
 
-  message_subdir[0] = split_spool_directory == i ? '\0' : id[5];
+  set_subdir_str(message_subdir, id, i);
   fname = spool_fname(US"input", message_subdir, id, US"-D");
   DEBUG(D_deliver) debug_printf("Trying spool file %s\n", fname);
 
   fname = spool_fname(US"input", message_subdir, id, US"-D");
   DEBUG(D_deliver) debug_printf("Trying spool file %s\n", fname);
 
@@ -105,9 +106,9 @@ lock_data.l_len = SPOOL_DATA_START_OFFSET;
 
 if (fcntl(fd, F_SETLK, &lock_data) < 0)
   {
 
 if (fcntl(fd, F_SETLK, &lock_data) < 0)
   {
-  log_write(L_skip_delivery,
-            LOG_MAIN,
-            "Spool file is locked (another process is handling this message)");
+  log_write(L_skip_delivery, LOG_MAIN,
+      "Spool file for %s is locked (another process is handling this message)",
+      id);
   (void)close(fd);
   errno = 0;
   return -1;
   (void)close(fd);
   errno = 0;
   return -1;
@@ -185,7 +186,7 @@ BOOL right = buffer[1] == 'Y';
 
 if (n < 5) return FALSE;    /* malformed line */
 buffer[n-1] = 0;            /* Remove \n */
 
 if (n < 5) return FALSE;    /* malformed line */
 buffer[n-1] = 0;            /* Remove \n */
-node = store_get(sizeof(tree_node) + n - 3, is_tainted(buffer));
+node = store_get(sizeof(tree_node) + n - 3, TRUE);     /* rcpt names tainted */
 *connect = node;
 Ustrcpy(node->name, buffer + 3);
 node->data.ptr = NULL;
 *connect = node;
 Ustrcpy(node->name, buffer + 3);
 node->data.ptr = NULL;
@@ -278,7 +279,7 @@ tls_in.certificate_verified = FALSE;
 # ifdef SUPPORT_DANE
 tls_in.dane_verified = FALSE;
 # endif
 # ifdef SUPPORT_DANE
 tls_in.dane_verified = FALSE;
 # endif
-tls_in.cipher = NULL;
+tls_in.ver = tls_in.cipher = NULL;
 # ifndef COMPILE_UTILITY       /* tls support fns not built in */
 tls_free_cert(&tls_in.ourcert);
 tls_free_cert(&tls_in.peercert);
 # ifndef COMPILE_UTILITY       /* tls support fns not built in */
 tls_free_cert(&tls_in.ourcert);
 tls_free_cert(&tls_in.peercert);
@@ -341,7 +342,6 @@ int n;
 int rcount = 0;
 long int uid, gid;
 BOOL inheader = FALSE;
 int rcount = 0;
 long int uid, gid;
 BOOL inheader = FALSE;
-uschar *p;
 
 /* Reset all the global variables to their default values. However, there is
 one exception. DO NOT change the default value of dont_deliver, because it may
 
 /* Reset all the global variables to their default values. However, there is
 one exception. DO NOT change the default value of dont_deliver, because it may
@@ -356,7 +356,7 @@ and unsplit directories, as for the data file above. */
 for (int n = 0; n < 2; n++)
   {
   if (!subdir_set)
 for (int n = 0; n < 2; n++)
   {
   if (!subdir_set)
-    message_subdir[0] = split_spool_directory == (n == 0) ? name[5] : 0;
+    set_subdir_str(message_subdir, name, n);
 
   if ((fp = Ufopen(spool_fname(US"input", message_subdir, name, US""), "rb")))
     break;
 
   if ((fp = Ufopen(spool_fname(US"input", message_subdir, name, US""), "rb")))
     break;
@@ -387,19 +387,21 @@ and the number of warning messages for delivery delays that have been sent. */
 
 if (Ufgets(big_buffer, big_buffer_size, fp) == NULL) goto SPOOL_READ_ERROR;
 
 
 if (Ufgets(big_buffer, big_buffer_size, fp) == NULL) goto SPOOL_READ_ERROR;
 
-p = big_buffer + Ustrlen(big_buffer);
-while (p > big_buffer && isspace(p[-1])) p--;
-*p = 0;
-if (!isdigit(p[-1])) goto SPOOL_FORMAT_ERROR;
-while (p > big_buffer && (isdigit(p[-1]) || '-' == p[-1])) p--;
-gid = Uatoi(p);
-if (p <= big_buffer || *(--p) != ' ') goto SPOOL_FORMAT_ERROR;
-*p = 0;
-if (!isdigit(p[-1])) goto SPOOL_FORMAT_ERROR;
-while (p > big_buffer && (isdigit(p[-1]) || '-' == p[-1])) p--;
-uid = Uatoi(p);
-if (p <= big_buffer || *(--p) != ' ') goto SPOOL_FORMAT_ERROR;
-*p = 0;
+ {
+  uschar *p = big_buffer + Ustrlen(big_buffer);
+  while (p > big_buffer && isspace(p[-1])) p--;
+  *p = 0;
+  if (!isdigit(p[-1])) goto SPOOL_FORMAT_ERROR;
+  while (p > big_buffer && (isdigit(p[-1]) || '-' == p[-1])) p--;
+  gid = Uatoi(p);
+  if (p <= big_buffer || *(--p) != ' ') goto SPOOL_FORMAT_ERROR;
+  *p = 0;
+  if (!isdigit(p[-1])) goto SPOOL_FORMAT_ERROR;
+  while (p > big_buffer && (isdigit(p[-1]) || '-' == p[-1])) p--;
+  uid = Uatoi(p);
+  if (p <= big_buffer || *(--p) != ' ') goto SPOOL_FORMAT_ERROR;
+  *p = 0;
+ }
 
 originator_login = string_copy(big_buffer);
 originator_uid = (uid_t)uid;
 
 originator_login = string_copy(big_buffer);
 originator_uid = (uid_t)uid;
@@ -422,12 +424,16 @@ if (sscanf(CS big_buffer, TIME_T_FMT " %d", &received_time.tv_sec, &warning_coun
 received_time.tv_usec = 0;
 
 message_age = time(NULL) - received_time.tv_sec;
 received_time.tv_usec = 0;
 
 message_age = time(NULL) - received_time.tv_sec;
+#ifndef COMPILE_UTILITY
+if (f.running_in_test_harness)
+  message_age = test_harness_fudged_queue_time(message_age);
+#endif
 
 #ifndef COMPILE_UTILITY
 DEBUG(D_deliver) debug_printf("user=%s uid=%ld gid=%ld sender=%s\n",
   originator_login, (long int)originator_uid, (long int)originator_gid,
   sender_address);
 
 #ifndef COMPILE_UTILITY
 DEBUG(D_deliver) debug_printf("user=%s uid=%ld gid=%ld sender=%s\n",
   originator_login, (long int)originator_uid, (long int)originator_gid,
   sender_address);
-#endif  /* COMPILE_UTILITY */
+#endif
 
 /* Now there may be a number of optional lines, each starting with "-". If you
 add a new setting here, make sure you set the default above.
 
 /* Now there may be a number of optional lines, each starting with "-". If you
 add a new setting here, make sure you set the default above.
@@ -449,6 +455,7 @@ for (;;)
   int len;
   BOOL tainted;
   uschar * var;
   int len;
   BOOL tainted;
   uschar * var;
+  const uschar * p;
 
   if (Ufgets(big_buffer, big_buffer_size, fp) == NULL) goto SPOOL_READ_ERROR;
   if (big_buffer[0] != '-') break;
 
   if (Ufgets(big_buffer, big_buffer_size, fp) == NULL) goto SPOOL_READ_ERROR;
   if (big_buffer[0] != '-') break;
@@ -659,28 +666,29 @@ for (;;)
     case 't':
     if (Ustrncmp(p, "ls_", 3) == 0)
       {
     case 't':
     if (Ustrncmp(p, "ls_", 3) == 0)
       {
-      uschar * q = p + 3;
+      const uschar * q = p + 3;
       if (Ustrncmp(q, "certificate_verified", 20) == 0)
        tls_in.certificate_verified = TRUE;
       else if (Ustrncmp(q, "cipher", 6) == 0)
       if (Ustrncmp(q, "certificate_verified", 20) == 0)
        tls_in.certificate_verified = TRUE;
       else if (Ustrncmp(q, "cipher", 6) == 0)
-       tls_in.cipher = string_copy_taint(var + 11, tainted);
+       tls_in.cipher = string_copy_taint(q+7, tainted);
 # ifndef COMPILE_UTILITY       /* tls support fns not built in */
       else if (Ustrncmp(q, "ourcert", 7) == 0)
 # ifndef COMPILE_UTILITY       /* tls support fns not built in */
       else if (Ustrncmp(q, "ourcert", 7) == 0)
-       (void) tls_import_cert(var + 12, &tls_in.ourcert);
+       (void) tls_import_cert(q+8, &tls_in.ourcert);
       else if (Ustrncmp(q, "peercert", 8) == 0)
       else if (Ustrncmp(q, "peercert", 8) == 0)
-       (void) tls_import_cert(var + 13, &tls_in.peercert);
+       (void) tls_import_cert(q+9, &tls_in.peercert);
 # endif
       else if (Ustrncmp(q, "peerdn", 6) == 0)
 # endif
       else if (Ustrncmp(q, "peerdn", 6) == 0)
-       tls_in.peerdn = string_unprinting(string_copy_taint(var + 11, tainted));
+       tls_in.peerdn = string_unprinting(string_copy_taint(q+7, tainted));
       else if (Ustrncmp(q, "sni", 3) == 0)
       else if (Ustrncmp(q, "sni", 3) == 0)
-       tls_in.sni = string_unprinting(string_copy_taint(var + 8, tainted));
+       tls_in.sni = string_unprinting(string_copy_taint(q+4, tainted));
       else if (Ustrncmp(q, "ocsp", 4) == 0)
       else if (Ustrncmp(q, "ocsp", 4) == 0)
-       tls_in.ocsp = var[9] - '0';
+       tls_in.ocsp = q[5] - '0';
 # ifdef EXPERIMENTAL_TLS_RESUME
       else if (Ustrncmp(q, "resumption", 10) == 0)
 # ifdef EXPERIMENTAL_TLS_RESUME
       else if (Ustrncmp(q, "resumption", 10) == 0)
-       tls_in.resumption = var[15] - 'A';
+       tls_in.resumption = q[11] - 'A';
 # endif
 # endif
-
+      else if (Ustrncmp(q, "ver", 3) == 0)
+       tls_in.ver = string_copy_taint(q+4, tainted);
       }
     break;
 #endif
       }
     break;
 #endif
@@ -708,7 +716,7 @@ host_build_sender_fullhost();
 #ifndef COMPILE_UTILITY
 DEBUG(D_deliver)
   debug_printf("sender_local=%d ident=%s\n", f.sender_local,
 #ifndef COMPILE_UTILITY
 DEBUG(D_deliver)
   debug_printf("sender_local=%d ident=%s\n", f.sender_local,
-    (sender_ident == NULL)? US"unset" : sender_ident);
+    sender_ident ? sender_ident : US"unset");
 #endif  /* COMPILE_UTILITY */
 
 /* We now have the tree of addresses NOT to deliver to, or a line
 #endif  /* COMPILE_UTILITY */
 
 /* We now have the tree of addresses NOT to deliver to, or a line
@@ -920,8 +928,8 @@ while ((n = fgetc(fp)) != EOF)
 
     if (h->type == htype_received) received_count++;
 
 
     if (h->type == htype_received) received_count++;
 
-    if (header_list == NULL) header_list = h;
-      else header_last->next = h;
+    if (header_list) header_last->next = h;
+    else header_list = h;
     header_last = h;
 
     for (i = 0; i < n; i++)
     header_last = h;
 
     for (i = 0; i < n; i++)
@@ -973,7 +981,7 @@ if (errno != 0)
 
   fclose(fp);
   errno = n;
 
   fclose(fp);
   errno = n;
-  return inheader? spool_read_hdrerror : spool_read_enverror;
+  return inheader ? spool_read_hdrerror : spool_read_enverror;
   }
 
 SPOOL_FORMAT_ERROR:
   }
 
 SPOOL_FORMAT_ERROR: