Merge branch '4.next'
authorJeremy Harris <jgh146exb@wizmail.org>
Sun, 26 Jun 2022 11:10:03 +0000 (12:10 +0100)
committerJeremy Harris <jgh146exb@wizmail.org>
Sun, 26 Jun 2022 11:21:08 +0000 (12:21 +0100)
1  2 
doc/doc-docbook/spec.xfpt
doc/doc-txt/ChangeLog
src/src/exim.c
src/src/expand.c
test/runtest

Simple merge
index 3e6da91852f69ecda5814c414a7e6e9a50f46894,0188488e10fba11164b94ac22d7f06392258ff7f..02ea32aa3a61aa37c8cf098bd7add4b413b3a75a
@@@ -2,6 -2,18 +2,18 @@@ This document describes *changes* to pr
  affect Exim's operation, with an unchanged configuration file.  For new
  options, and new features, see the NewStuff file next to this ChangeLog.
  
 -SINCE Exim version 4.96
++Exim version 4.97
+ -----------------
+ JH/01 The hosts_connection_nolog main option now also controls "no MAIL in
+       SMTP connection" log lines.
+ JH/02 Option default value updates:
+       - queue_fast_ramp (main)        true (was false)
+       - remote_max_parallel (main)    4 (was 2)
+ JH/03 Cache static regex pattern compilations, for use by ACLs.
  Exim version 4.96
  -----------------
  
diff --cc src/src/exim.c
Simple merge
index 36c9f423bedf06e844bb84a2a9aece8344a57472,acde8d5164ba731c9a082b6a49770b0a88d06845..ffbdc14e514bba1eba144fbba497b5eddb10e8b4
@@@ -6942,75 -6957,69 +6957,74 @@@ while (*s
          case 2:
          case 3: goto EXPAND_FAILED;
          }
-       if (skipping) continue;
  
 -      g = string_catn(g, US"SRS0=", 5);
 -
 -      /* ${l_4:${hmac{md5}{SRS_SECRET}{${lc:$return_path}}}}= */
 -      hmac_md5(sub[0], string_copylc(sub[1]), cksum, sizeof(cksum));
 -      g = string_catn(g, cksum, sizeof(cksum));
 -      g = string_catn(g, US"=", 1);
 -
 -      /* ${base32:${eval:$tod_epoch/86400&0x3ff}}= */
 +      if (sub[1] && *(sub[1]))
        {
 -      struct timeval now;
 -      unsigned long i;
 -      gstring * h = NULL;
 -
 -      gettimeofday(&now, NULL);
 -      for (unsigned long i = (now.tv_sec / 86400) & 0x3ff; i; i >>= 5)
 -        h = string_catn(h, &base32_chars[i & 0x1f], 1);
 -      if (h) while (h->ptr > 0)
 -        g = string_catn(g, &h->s[--h->ptr], 1);
 -      }
 -      g = string_catn(g, US"=", 1);
 +      g = string_catn(g, US"SRS0=", 5);
  
 -      /* ${domain:$return_path}=${local_part:$return_path} */
 -      {
 -        int start, end, domain;
 -        uschar * t = parse_extract_address(sub[1], &expand_string_message,
 -                                        &start, &end, &domain, FALSE);
 -      uschar * s;
 +      /* ${l_4:${hmac{md5}{SRS_SECRET}{${lc:$return_path}}}}= */
 +      hmac_md5(sub[0], string_copylc(sub[1]), cksum, sizeof(cksum));
 +      g = string_catn(g, cksum, sizeof(cksum));
 +      g = string_catn(g, US"=", 1);
  
 -        if (!t)
 -        goto EXPAND_FAILED;
 +      /* ${base32:${eval:$tod_epoch/86400&0x3ff}}= */
 +        {
 +        struct timeval now;
 +        unsigned long i;
 +        gstring * h = NULL;
  
 -      if (domain > 0) g = string_cat(g, t + domain);
 +        gettimeofday(&now, NULL);
 +        for (unsigned long i = (now.tv_sec / 86400) & 0x3ff; i; i >>= 5)
 +          h = string_catn(h, &base32_chars[i & 0x1f], 1);
 +        if (h) while (h->ptr > 0)
 +          g = string_catn(g, &h->s[--h->ptr], 1);
 +        }
        g = string_catn(g, US"=", 1);
  
 -      s = domain > 0 ? string_copyn(t, domain - 1) : t;
 -      if ((quoted = Ustrchr(s, '"') != NULL))
 +      /* ${domain:$return_path}=${local_part:$return_path} */
          {
 -        gstring * h = NULL;
 -        DEBUG(D_expand) debug_printf_indent("auto-quoting local part\n");
 -        while (*s)            /* de-quote */
 +        int start, end, domain;
 +        uschar * t = parse_extract_address(sub[1], &expand_string_message,
 +                                          &start, &end, &domain, FALSE);
 +        uschar * s;
 +
 +        if (!t)
 +          goto EXPAND_FAILED;
 +
 +        if (domain > 0) g = string_cat(g, t + domain);
 +        g = string_catn(g, US"=", 1);
 +
 +        s = domain > 0 ? string_copyn(t, domain - 1) : t;
 +        if ((quoted = Ustrchr(s, '"') != NULL))
            {
 -          while (*s && *s != '"') h = string_catn(h, s++, 1);
 -          if (*s) s++;
 -          while (*s && *s != '"') h = string_catn(h, s++, 1);
 -          if (*s) s++;
 +          gstring * h = NULL;
 +          DEBUG(D_expand) debug_printf_indent("auto-quoting local part\n");
 +          while (*s)          /* de-quote */
 +            {
 +            while (*s && *s != '"') h = string_catn(h, s++, 1);
 +            if (*s) s++;
 +            while (*s && *s != '"') h = string_catn(h, s++, 1);
 +            if (*s) s++;
 +            }
 +          gstring_release_unused(h);
 +          s = string_from_gstring(h);
            }
 -        gstring_release_unused(h);
 -        s = string_from_gstring(h);
 +        g = string_cat(g, s);
          }
 -      g = string_cat(g, s);
 -        }
  
 -      /* Assume that if the original local_part had quotes
 -      it was for good reason */
 +      /* Assume that if the original local_part had quotes
 +      it was for good reason */
  
 -      if (quoted) yield = string_catn(yield, US"\"", 1);
 -      yield = string_catn(yield, g->s, g->ptr);
 -      if (quoted) yield = string_catn(yield, US"\"", 1);
 +      if (quoted) yield = string_catn(yield, US"\"", 1);
 +      yield = string_catn(yield, g->s, g->ptr);
 +      if (quoted) yield = string_catn(yield, US"\"", 1);
  
 -      /* @$original_domain */
 -      yield = string_catn(yield, US"@", 1);
 -      yield = string_cat(yield, sub[2]);
 +      /* @$original_domain */
 +      yield = string_catn(yield, US"@", 1);
 +      yield = string_cat(yield, sub[2]);
 +      }
 +      else
 +      DEBUG(D_expand) debug_printf_indent("null return_path for srs-encode\n");
  
        break;
        }
diff --cc test/runtest
Simple merge