Fix crash in expansions
authorJeremy Harris <jgh146exb@wizmail.org>
Thu, 2 Feb 2023 20:00:35 +0000 (20:00 +0000)
committerJeremy Harris <jgh146exb@wizmail.org>
Thu, 2 Feb 2023 20:00:35 +0000 (20:00 +0000)
Broken-by: 1058096b8c53
doc/doc-txt/ChangeLog
src/src/expand.c
test/stderr/0630

index d85af1786e1cff5e38e11570ae0344d348632e0c..bad73cc7bad8b41a7818ba1c17493c6079f9d309 100644 (file)
@@ -105,6 +105,10 @@ JH/20 Fix TLSA lookups.  Previously dns_again_means_nonexist would affect
 JH/21 Bug 2434: Add connection-elapsed "D=" element to more connection
       closure log lines.
 
+JH/23 Fix crash in string expansions. Previously, if an empty variable was
+      immediately followed by an expansion operator, a null-indirection read
+      was done, killing the process.
+
 
 Exim version 4.96
 -----------------
index 10f009ce2a928b7e5fe7ed2c2bd34381963cf5cd..a7e6e4fb3ea7dbeb1893af97b1080d0c62177e9d 100644 (file)
@@ -4747,7 +4747,7 @@ while (*s)
     continue;
     }
 
-  if (isdigit(*s))
+  if (isdigit(*s))             /* A $<n> variable */
     {
     int n;
     s = read_cnumber(&n, s);
@@ -7165,6 +7165,7 @@ NOT_ITEM: ;
 
     /* Deal specially with operators that might take a certificate variable
     as we do not want to do the usual expansion. For most, expand the string.*/
+
     switch(c)
       {
 #ifndef DISABLE_TLS
@@ -7213,7 +7214,7 @@ NOT_ITEM: ;
     to the main loop top. */
 
      {
-     int start = yield->ptr;
+     unsigned expansion_start = gstring_length(yield);
      switch(c)
       {
       case EOP_BASE32:
@@ -8275,8 +8276,8 @@ NOT_ITEM: ;
 
        DEBUG(D_expand)
        {
-       const uschar * s = yield->s + start;
-       int i = yield->ptr - start;
+       const uschar * s = yield->s + expansion_start;
+       int i = gstring_length(yield) - expansion_start;
        BOOL tainted = is_tainted(s);
 
        DEBUG(D_noutf8)
index 28904eb9486fb64073b6e565ce7b638b15b08ff7..3ecc9dcbd37fd6300812a671000057225568179d 100644 (file)
@@ -1,3 +1,4 @@
+01:01:01 p1235  no   domain  retry record
 01:01:01 p1235  no   address retry record
 01:01:01 p1235  dest3@test.ex: queued for routing
 01:01:01 p1235  >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>