Gitweb:
https://git.exim.org/exim.git/commitdiff/ce336ea1afd8d5f6b79d36fc7ec4313f3d80146b
Commit: ce336ea1afd8d5f6b79d36fc7ec4313f3d80146b
Parent: b037dd69615b2ce9e084932e8a61477afc67345e
Author: Jeremy Harris <jgh146exb@???>
AuthorDate: Thu Dec 7 19:59:35 2023 +0000
Committer: Jeremy Harris <jgh146exb@???>
CommitDate: Thu Dec 7 19:59:35 2023 +0000
Handle expansion fails in router "set" options. Bug 3058
---
doc/doc-docbook/spec.xfpt | 1 +
doc/doc-txt/ChangeLog | 4 ++++
src/src/route.c | 18 +++++++++++-------
test/confs/0606 | 15 +++++++++++++++
test/log/0606 | 4 ++++
test/mail/0606.b | 3 +--
test/scripts/0000-Basic/0606 | 2 +-
7 files changed, 37 insertions(+), 10 deletions(-)
diff --git a/doc/doc-docbook/spec.xfpt b/doc/doc-docbook/spec.xfpt
index dc8f5cc4d..0007d255e 100644
--- a/doc/doc-docbook/spec.xfpt
+++ b/doc/doc-docbook/spec.xfpt
@@ -25918,6 +25918,7 @@ permits this.
.cindex "line length" limit
This option sets the maximum line length, in bytes, that the transport
will send. Any messages with lines exceeding the given value
+(before a transport filter, if any)
will fail and a failure-DSN ("bounce") message will if possible be returned
to the sender.
The default value is that defined by the SMTP standards.
diff --git a/doc/doc-txt/ChangeLog b/doc/doc-txt/ChangeLog
index 2d82df43d..85064cc8d 100644
--- a/doc/doc-txt/ChangeLog
+++ b/doc/doc-txt/ChangeLog
@@ -49,6 +49,10 @@ JH/09 Bug 3057: Add heuristic for spotting mistyped IPv6 addresses in lists
documentation, the error results by default in a no-match result for the
list. It is logged if the unknown_in_list log_selector is used.
+JH/10 Bug 3058: Ensure that a failing expansion in a router "set" option defers
+ the routing operation. Previously it would silently stop routing the
+ message.
+
Exim version 4.97
diff --git a/src/src/route.c b/src/src/route.c
index 0bd87b837..3401f15b4 100644
--- a/src/src/route.c
+++ b/src/src/route.c
@@ -1492,7 +1492,11 @@ for (uschar * ele; (ele = string_nextinlist(&varlist, &sep, NULL, 0)); )
{
addr->message = string_sprintf("expansion of \"%s\" failed "
"in %s router: %s", ele, r->name, expand_string_message);
- return DEFER;
+ /* Caller will replace that for logging, if a DB lookup, to avoid exposing
+ passwords */
+ DEBUG(D_route) debug_printf("%s\n", addr->message);
+ if (!f.search_find_defer)
+ return f.search_find_defer ? DEFER : FAIL;
}
if (!(node = tree_search(*root, name)))
@@ -1546,8 +1550,8 @@ route_address(address_item *addr, address_item **paddr_local,
{
int yield = OK;
BOOL unseen;
-router_instance *r, *nextr;
-const uschar *old_domain = addr->domain;
+router_instance * r, * nextr;
+const uschar * old_domain = addr->domain;
HDEBUG(D_route)
{
@@ -1561,8 +1565,8 @@ instead of at the first router. */
for (r = addr->start_router ? addr->start_router : routers; r; r = nextr)
{
- uschar *error;
- struct passwd *pw = NULL;
+ uschar * error;
+ struct passwd * pw = NULL;
struct passwd pwcopy;
BOOL loop_detected = FALSE;
BOOL more;
@@ -1736,11 +1740,11 @@ for (r = addr->start_router ? addr->start_router : routers; r; r = nextr)
router traversal. On the addr string they are held as a variable tree, so
as to maintain the post-expansion taints separate. */
- switch (set_router_vars(addr, r))
+ switch (rc = set_router_vars(addr, r))
{
case OK: break;
case PASS: continue; /* with next router */
- default: goto ROUTE_EXIT;
+ default: yield = rc; goto ROUTE_EXIT;
}
/* Finally, expand the address_data field in the router. Forced failure
diff --git a/test/confs/0606 b/test/confs/0606
index 6388962db..63aa94897 100644
--- a/test/confs/0606
+++ b/test/confs/0606
@@ -19,10 +19,21 @@ not_smtp:
begin routers
+dump_bounce:
+ driver = redirect
+ senders = :
+ data = :blackhole:
+
hide_verifies:
driver = accept
verify_only
+bad:
+ driver = accept
+ local_parts = bad
+ set = r_srs_domain = ${lookup mysql{wrong things
+ transport = local_delivery
+
alias:
driver = redirect
debug_print = DEBUG: $r_r1 $r_r2
@@ -66,4 +77,8 @@ local_delivery:
headers_add = X-r1: <$r_r1>\nX-r2: <$r_r2>\nX-r3: <$r_r3>
+# ----- Retry -----
+begin retry
+* * F,5d,10s
+
# End
diff --git a/test/log/0606 b/test/log/0606
index 58d340f03..718c2d4ff 100644
--- a/test/log/0606
+++ b/test/log/0606
@@ -1,3 +1,7 @@
1999-03-02 09:44:33 10HmaX-000000005vi-0000 <= CALLER@??? U=CALLER P=local S=sss
+1999-03-02 09:44:33 10HmaX-000000005vi-0000 ** bad@??? R=bad: Temporary internal error
1999-03-02 09:44:33 10HmaX-000000005vi-0000 => b <a@???> R=user T=local_delivery
+1999-03-02 09:44:33 10HmaY-000000005vi-0000 <= <> R=10HmaX-000000005vi-0000 U=EXIMUSER P=local S=sss
+1999-03-02 09:44:33 10HmaY-000000005vi-0000 => :blackhole: <CALLER@???> R=dump_bounce
+1999-03-02 09:44:33 10HmaY-000000005vi-0000 Completed
1999-03-02 09:44:33 10HmaX-000000005vi-0000 Completed
diff --git a/test/mail/0606.b b/test/mail/0606.b
index cd4125850..5f9ac43a9 100644
--- a/test/mail/0606.b
+++ b/test/mail/0606.b
@@ -2,8 +2,7 @@ From bad_check@??? Tue Mar 02 09:44:33 1999
Envelope-to: a@???
Received: from CALLER by the.local.host.name with local (Exim x.yz)
(envelope-from <CALLER@???>)
- id 10HmaX-000000005vi-0000
- for a@???;
+ id 10HmaX-000000005vi-0000;
Tue, 2 Mar 1999 09:44:33 +0000
Subject: foo
Message-Id: <E10HmaX-000000005vi-0000@???>
diff --git a/test/scripts/0000-Basic/0606 b/test/scripts/0000-Basic/0606
index 96d598834..5bac064d3 100644
--- a/test/scripts/0000-Basic/0606
+++ b/test/scripts/0000-Basic/0606
@@ -1,5 +1,5 @@
# router variables
-exim -odi a
+exim -odi a bad
Subject: foo
body
--
## subscription configuration (requires account):
##
https://lists.exim.org/mailman3/postorius/lists/exim-cvs.lists.exim.org/
## unsubscribe (doesn't require an account):
## exim-cvs-unsubscribe@???
## Exim details at
http://www.exim.org/
## Please use the Wiki with this list -
http://wiki.exim.org/