From: Jasen Betts Date: Mon, 18 Feb 2019 13:52:16 +0000 (+0000) Subject: Fix expansions for RFC 822 addresses having comments in local-part and/or domain... X-Git-Url: https://git.exim.org/exim.git/commitdiff_plain/f634b80846cc7ffcab65c9855bcb35312f0232e8?ds=sidebyside;hp=c15523829ba17cce5829e2976aa1ff928965d948 Fix expansions for RFC 822 addresses having comments in local-part and/or domain. Bug 2375 (cherry picked from commit e2ff8e24f41caca3623228b1ec66a3f3961ecad6) --- diff --git a/doc/doc-txt/ChangeLog b/doc/doc-txt/ChangeLog index 867a1d8ab..9659da322 100644 --- a/doc/doc-txt/ChangeLog +++ b/doc/doc-txt/ChangeLog @@ -18,6 +18,9 @@ JH/07 GnuTLS: Our use of late (post-handshake) certificate verification, under TLS connection attempt, so that the normal retry-in-clear can work (if suitably configured). +JB/01 BZg 2375: fix expansions of 822 addresses having comments in local-part + and/or domain. Found and fixed by Jason Betts. + Exim version 4.92 ----------------- diff --git a/src/src/expand.c b/src/src/expand.c index 2c290251d..35ede7185 100644 --- a/src/src/expand.c +++ b/src/src/expand.c @@ -7073,16 +7073,11 @@ while (*s != 0) uschar * t = parse_extract_address(sub, &error, &start, &end, &domain, FALSE); if (t) - if (c != EOP_DOMAIN) - { - if (c == EOP_LOCAL_PART && domain != 0) end = start + domain - 1; - yield = string_catn(yield, sub+start, end-start); - } - else if (domain != 0) - { - domain += start; - yield = string_catn(yield, sub+domain, end-domain); - } + yield = c == EOP_DOMAIN + ? string_cat(yield, t + domain) + : c == EOP_LOCAL_PART && domain > 0 + ? string_catn(yield, t, domain - 1 ) + : string_cat(yield, t); continue; } @@ -7106,7 +7101,7 @@ while (*s != 0) for (;;) { - uschar *p = parse_find_address_end(sub, FALSE); + uschar * p = parse_find_address_end(sub, FALSE); uschar saveend = *p; *p = '\0'; address = parse_extract_address(sub, &error, &start, &end, &domain, @@ -7119,7 +7114,7 @@ while (*s != 0) list, add in a space if the new address begins with the separator character, or is an empty string. */ - if (address != NULL) + if (address) { if (yield->ptr != save_ptr && address[0] == *outsep) yield = string_catn(yield, US" ", 1); diff --git a/test/scripts/0000-Basic/0002 b/test/scripts/0000-Basic/0002 index 7a9b38dba..1f520f671 100644 --- a/test/scripts/0000-Basic/0002 +++ b/test/scripts/0000-Basic/0002 @@ -123,8 +123,14 @@ acl: ${reduce {1:2:3:4} {} {$value ${acl {a_ret}{$item}}}} addrss: ${address:local-part@dom.ain} addrss: ${address:Exim Person (that's me)} +addrss: ${address:Exim Person (that's me)} +addrss: ${address:Exim Person (that's me)} +addrss: ${address:Exim Person (that's me)} +addrss: ${address:Exim Person (that's me)} +addrss: ${address:Exim Person <(comment)local-part@dom.ain(comment2)> (that's me)} domain: ${domain:local-part@dom.ain} domain: ${domain:Exim Person (that's me)} +domain: ${domain:Exim Person (that's me)} addresses: ${addresses:>' 'abc@xyz, 'pqr@xyz} addresses: ${addresses:Exim Person (that's me)} @@ -244,6 +250,7 @@ lc/uc: ${lc:The Quick} ${uc: Brown Fox} length: ${length_10:The quick brown fox} ${l_10:abc} lclpt: ${local_part:local-part@dom.ain} lclpt: ${local_part:Exim Person (that's me)} +lclpt: ${local_part:Exim Person (that's me)} quote: ${quote:aZ09_.-Q} ${quote:ab*cd} ${quote:ab\cd"ef} quote: ${quote:nl(\n)} quote: ${quote:cr(\r)} diff --git a/test/stdout/0002 b/test/stdout/0002 index c2f5f2f3c..25535fc9f 100644 --- a/test/stdout/0002 +++ b/test/stdout/0002 @@ -115,6 +115,12 @@ > > addrss: local-part@dom.ain > addrss: local-part@dom.ain +> addrss: local-part@dom.ain +> addrss: local-part@dom.ain +> addrss: local-part@dom.ain +> addrss: local-part.dot-atom@dom.ain +> addrss: local-part@dom.ain +> domain: dom.ain > domain: dom.ain > domain: dom.ain > @@ -226,6 +232,7 @@ newline tab\134backslash ~tilde\177DEL\200\201. > length: The quick abc > lclpt: local-part > lclpt: local-part +> lclpt: local.part > quote: aZ09_.-Q "ab*cd" "abcd\"ef" > quote: "nl(\n)" > quote: "cr(\r)"