From 1435d4b244871b65c6bb07878ddd2241ae8d2545 Mon Sep 17 00:00:00 2001 From: Jeremy Harris Date: Sat, 6 Aug 2016 18:28:18 +0100 Subject: [PATCH] Routing: in a dnslookup, fix fail_defer_domains to defer on missing MX record. Bug 1867 --- doc/doc-txt/ChangeLog | 3 +++ src/src/routers/dnslookup.c | 32 ++++++++++++++++---------------- src/src/utf8.c | 2 +- test/confs/0099 | 2 +- test/log/0099 | 4 +++- test/scripts/0000-Basic/0099 | 8 ++++++-- test/stdout/0099 | 6 ++++-- 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 -- 2.25.1