summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/doc-txt/ChangeLog3
-rw-r--r--src/src/routers/dnslookup.c32
-rw-r--r--src/src/utf8.c2
-rw-r--r--test/confs/00992
-rw-r--r--test/log/00994
-rw-r--r--test/scripts/0000-Basic/00998
-rw-r--r--test/stdout/00996
7 files changed, 34 insertions, 23 deletions
diff --git a/doc/doc-txt/ChangeLog b/doc/doc-txt/ChangeLog
index 11b25f875..148329505 100644
--- a/doc/doc-txt/ChangeLog
+++ b/doc/doc-txt/ChangeLog
@@ -68,6 +68,9 @@ JH/16 DANE: treat a TLSA lookup response having all non-TLSA RRs, the same
JH/17 Fakereject: previously logged as a norml message arrival "<="; now
distinguished as "(=".
+JH/18 Bug 1867: make the fail_defer_domains option on a dnslookup router work
+ for missing MX records. Previously it only worked for missing A records.
+
Exim version 4.87
-----------------
diff --git a/src/src/routers/dnslookup.c b/src/src/routers/dnslookup.c
index 83ba5f689..d2be40e0f 100644
--- a/src/src/routers/dnslookup.c
+++ b/src/src/routers/dnslookup.c
@@ -305,6 +305,22 @@ for (;;)
if (rc != HOST_FIND_FAILED) break;
+ if (ob->fail_defer_domains)
+ switch(match_isinlist(fully_qualified_name,
+ CUSS &ob->fail_defer_domains, 0,
+ &domainlist_anchor, addr->domain_cache, MCL_DOMAIN, TRUE, NULL))
+ {
+ case DEFER:
+ addr->message = US"lookup defer for fail_defer_domains option";
+ return DEFER;
+
+ case OK:
+ DEBUG(D_route) debug_printf("%s router: matched fail_defer_domains\n",
+ rblock->name);
+ addr->message = US"missing MX, or all MXs point to missing A records,"
+ " and defer requested";
+ return DEFER;
+ }
/* Check to see if the failure is the result of MX records pointing to
non-existent domains, and if so, set an appropriate error message; the case
of an MX or SRV record pointing to "." is another special case that we can
@@ -335,22 +351,6 @@ for (;;)
addr->message);
}
}
- if (ob->fail_defer_domains)
- {
- switch(match_isinlist(fully_qualified_name,
- CUSS &ob->fail_defer_domains, 0,
- &domainlist_anchor, addr->domain_cache, MCL_DOMAIN, TRUE, NULL))
- {
- case DEFER:
- addr->message = US"lookup defer for fail_defer_domains";
- return DEFER;
-
- case OK:
- DEBUG(D_route) debug_printf("%s router: matched fail_defer_domains\n",
- rblock->name);
- return DEFER;
- }
- }
return DECLINE;
}
diff --git a/src/src/utf8.c b/src/src/utf8.c
index 84ad1dc18..e394db0a8 100644
--- a/src/src/utf8.c
+++ b/src/src/utf8.c
@@ -18,7 +18,7 @@ BOOL
string_is_utf8(const uschar * s)
{
uschar c;
-while ((c = *s++)) if (c & 0x80) return TRUE;
+if (s) while ((c = *s++)) if (c & 0x80) return TRUE;
return FALSE;
}
diff --git a/test/confs/0099 b/test/confs/0099
index 8db58dcb0..8b4299130 100644
--- a/test/confs/0099
+++ b/test/confs/0099
@@ -19,7 +19,7 @@ begin routers
bydns:
driver = dnslookup
- domains = mxt2.test.ex
+ domains = mxt2.test.ex : mxnonexist.test.ex
transport = smtp
fail_defer_domains = *
diff --git a/test/log/0099 b/test/log/0099
index 4b6439219..13a1916c1 100644
--- a/test/log/0099
+++ b/test/log/0099
@@ -25,4 +25,6 @@
1999-03-02 09:44:33 10HmbC-0005vi-00 no IP address found for host nonexist.test.ex
1999-03-02 09:44:33 10HmbC-0005vi-00 == userx@nonexist R=all defer (-32): lookup of host "nonexist.test.ex" failed in all router
1999-03-02 09:44:33 10HmbD-0005vi-00 <= CALLER@test.ex U=CALLER P=local S=sss for userx@mxt2.test.ex
-1999-03-02 09:44:33 10HmbD-0005vi-00 == userx@mxt2.test.ex R=bydns defer (-32): all relevant MX records point to non-existent hosts
+1999-03-02 09:44:33 10HmbD-0005vi-00 == userx@mxt2.test.ex R=bydns defer (-1): missing MX, or all MXs point to missing A records, and defer requested
+1999-03-02 09:44:33 10HmbE-0005vi-00 <= CALLER@test.ex U=CALLER P=local S=sss for userx@mxnonexist.test.ex
+1999-03-02 09:44:33 10HmbE-0005vi-00 == userx@mxnonexist.test.ex R=bydns defer (-1): missing MX, or all MXs point to missing A records, and defer requested
diff --git a/test/scripts/0000-Basic/0099 b/test/scripts/0000-Basic/0099
index c386e1e85..d6655dcf9 100644
--- a/test/scripts/0000-Basic/0099
+++ b/test/scripts/0000-Basic/0099
@@ -38,14 +38,18 @@ Test message
****
dump retry
#
-# one for a lookup-failure (in manualroute)
+# a lookup-failure (in manualroute)
exim -odi userx@nonexist
Test message
****
-# one for a lookup-failure (in dnslookup)
+# a lookup-failure (good MX, missing A) in dnslookup, deferred
exim -odi userx@mxt2.test.ex
Test message
****
+# a lookup-failure (missing MX) in dnslookup, deferred
+exim -odi userx@mxnonexist.test.ex
+Test message
+****
dump retry
#
#
diff --git a/test/stdout/0099 b/test/stdout/0099
index 0f6f7f2fa..e14fa0a35 100644
--- a/test/stdout/0099
+++ b/test/stdout/0099
@@ -41,8 +41,10 @@ first failed = time last try = time2 next try = time2 + 900
T:thisloop.test.ex:999 dd 65 Connection refused
first failed = time last try = time2 next try = time2 + 900
+++++++++++++++++++++++++++
- R:mxt2.test.ex -32 0 all relevant MX records point to non-existent hosts
-first failed = time last try = time2 next try = time2 + 1800
+ R:mxnonexist.test.ex -1 0 missing MX, or all MXs point to missing A records, and defer requested
+first failed = time last try = time2 next try = time2 + 900
+ R:mxt2.test.ex -1 0 missing MX, or all MXs point to missing A records, and defer requested
+first failed = time last try = time2 next try = time2 + 900
R:nonexist -32 0 lookup of host "nonexist.test.ex" failed in all router
first failed = time last try = time2 next try = time2 + 1800
T:thishost.test.ex:127.0.0.1:999 dd 65 Connection refused