Routing: in a dnslookup, fix fail_defer_domains to defer on missing MX record. Bug...
authorJeremy Harris <jgh146exb@wizmail.org>
Sat, 6 Aug 2016 17:28:18 +0000 (18:28 +0100)
committerJeremy Harris <jgh146exb@wizmail.org>
Sat, 6 Aug 2016 20:51:20 +0000 (21:51 +0100)
doc/doc-txt/ChangeLog
src/src/routers/dnslookup.c
src/src/utf8.c
test/confs/0099
test/log/0099
test/scripts/0000-Basic/0099
test/stdout/0099

index 11b25f875bb4ee2667d6a68624cb0b3674ac4190..14832950542524c2387d69a8c7fc2c077fe113d4 100644 (file)
@@ -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
 -----------------
index 83ba5f689caeee9d23bc57484f6944d3b00cfebe..d2be40e0fbffd47978730c4a3793366b0311976d 100644 (file)
@@ -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;
     }
 
index 84ad1dc18f5744ecb8841df1f354726e57888704..e394db0a8a8e59082dfa3d2d6f4a54696bbd92e8 100644 (file)
@@ -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;
 }
 
index 8db58dcb0c90c3116b703806cadb12ae5b0d47b7..8b4299130b65253f594e54dd769b628ccf08de86 100644 (file)
@@ -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 = *
 
index 4b6439219a544c9885ac4660c1f4205ed15700f9..13a1916c18b098bb3a3dfd9ab19d7dcba822b47a 100644 (file)
@@ -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
index c386e1e85424563e6767a125bfb9a50a8c8b1ab2..d6655dcf9deb8b7decf51cf15d7f091a4eef53f0 100644 (file)
@@ -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
 #
 #
index 0f6f7f2faa078cfa4881c29b649766703f2fbf90..e14fa0a3513fe46ed37682e7a0fff6cd284ebd5b 100644 (file)
@@ -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