Fix ${srs_encode ..} for mod-1024 day zero
authorJeremy Harris <jgh146exb@wizmail.org>
Tue, 11 Apr 2023 10:59:08 +0000 (11:59 +0100)
committerJeremy Harris <jgh146exb@wizmail.org>
Tue, 11 Apr 2023 10:59:08 +0000 (11:59 +0100)
doc/doc-txt/ChangeLog
src/src/expand.c

index 16d2b8ef84fc3dd4797e73667298e42a6e9b87bf..d29ba6f6507ccde01753047c361bed4f5dc8d79d 100644 (file)
@@ -122,6 +122,9 @@ JH/25 Bug 2827: Restrict size of References: header in bounce messages to 998
 JH/26 For a ${readsocket } in TLS mode, send a TLS Close Alert before the TCP
       close.  Previously a bare socket close was done.
 
+JH/27 Fix ${srs_encode ..}.  Previously it would give a bad result for one day
+      every 1024 days.
+
 
 Exim version 4.96
 -----------------
index fe0fd1469400a31d47534e98424682c51f9ca403..26df25795ce5be77d5d612b8da939b085b46087b 100644 (file)
@@ -3523,7 +3523,7 @@ switch(cond_type = identify_operator(&s, &opname))
 
     /* Match the given local_part against the SRS-encoded pattern */
 
-    re = regex_must_compile(US"^(?i)SRS0=([^=]+)=([A-Z2-7]+)=([^=]*)=(.*)$",
+    re = regex_must_compile(US"^(?i)SRS0=([^=]+)=([A-Z2-7]{2})=([^=]*)=(.*)$",
                            MCS_CASELESS | MCS_CACHEABLE, FALSE);
     md = pcre2_match_data_create(4+1, pcre_gen_ctx);
     if (pcre2_match(re, sub[0], PCRE2_ZERO_TERMINATED, 0, PCRE_EOPT,
@@ -7061,13 +7061,11 @@ while (*s)
          {
          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);
+         i = (now.tv_sec / 86400) & 0x3ff;
+         g = string_catn(g, &base32_chars[i >> 5], 1);
+         g = string_catn(g, &base32_chars[i & 0x1f], 1);
          }
        g = string_catn(g, US"=", 1);