Fix misleading verification output when -v is used with -bv and aliasing
authorPhilip Hazel <ph10@hermes.cam.ac.uk>
Tue, 3 Oct 2006 10:25:55 +0000 (10:25 +0000)
committerPhilip Hazel <ph10@hermes.cam.ac.uk>
Tue, 3 Oct 2006 10:25:55 +0000 (10:25 +0000)
leads to a mixture of successful and unsuccessful verification.

doc/doc-txt/ChangeLog
src/src/verify.c
test/aux-fixed/0212.aliases
test/scripts/0000-Basic/0212
test/stdout/0212

index b5e0aa2..111d2ae 100644 (file)
@@ -1,4 +1,4 @@
-$Cambridge: exim/doc/doc-txt/ChangeLog,v 1.401 2006/10/03 08:54:50 ph10 Exp $
+$Cambridge: exim/doc/doc-txt/ChangeLog,v 1.402 2006/10/03 10:25:55 ph10 Exp $
 
 Change log file for Exim from version 4.21
 -------------------------------------------
@@ -82,6 +82,15 @@ PH/12 Installed Andrey Panin's patch to add a dovecot authenticator. Various
 PH/13 Added $message_headers_raw to provide the headers without RFC 2047
       decoding.
 
+PH/14 Corrected misleading output from -bv when -v was also used. Suppose the
+      address A is aliased to B and C, where B exists and C does not. Without
+      -v the output is "A verified" because verification stops after a
+      successful redirection if more than one address is generated. However,
+      with -v the child addresses are also verified. Exim was outputting "A
+      failed to verify" and then showing the successful verification for C,
+      with its parentage. It now outputs "B failed to verify", showing B's
+      parentage before showing the successful verification of C.
+
 
 Exim version 4.63
 -----------------
index 8881926..d180fda 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/verify.c,v 1.39 2006/09/25 11:25:37 ph10 Exp $ */
+/* $Cambridge: exim/src/src/verify.c,v 1.40 2006/10/03 10:25:55 ph10 Exp $ */
 
 /*************************************************
 *     Exim - an Internet mail transport agent    *
@@ -1009,11 +1009,17 @@ information about the top level address, not anything that it generated. */
 while (addr_new != NULL)
   {
   int rc;
+  uschar *show_address;
   address_item *addr = addr_new;
 
   addr_new = addr->next;
   addr->next = NULL;
 
+  /* When full_info is set, child addresses are displayed in top-level
+  messages. Otherwise, we show only the top level address. */
+
+  show_address = full_info? addr->address : address;
+
   DEBUG(D_verify)
     {
     debug_printf(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");
@@ -1207,14 +1213,24 @@ while (addr_new != NULL)
     allok = FALSE;
     if (f != NULL)
       {
-      fprintf(f, "%s%s %s", ko_prefix, address,
+      address_item *p = addr->parent;
+
+      fprintf(f, "%s%s %s", ko_prefix, show_address,
         address_test_mode? "is undeliverable" : "failed to verify");
       if (!expn && admin_user)
         {
         if (addr->basic_errno > 0)
           fprintf(f, ": %s", strerror(addr->basic_errno));
         if (addr->message != NULL)
-          fprintf(f, ":\n  %s", addr->message);
+          fprintf(f, ": %s", addr->message);
+        }
+
+      /* Show parents iff doing full info */
+
+      if (full_info) while (p != NULL)
+        {
+        fprintf(f, "%s\n    <-- %s", cr, p->address);
+        p = p->parent;
         }
       fprintf(f, "%s\n", cr);
       }
@@ -1230,25 +1246,35 @@ while (addr_new != NULL)
     allok = FALSE;
     if (f != NULL)
       {
-      fprintf(f, "%s%s cannot be resolved at this time", ko_prefix, address);
+      address_item *p = addr->parent;
+      fprintf(f, "%s%s cannot be resolved at this time", ko_prefix,
+        show_address);
       if (!expn && admin_user)
         {
         if (addr->basic_errno > 0)
-          fprintf(f, ":\n  %s", strerror(addr->basic_errno));
+          fprintf(f, ": %s", strerror(addr->basic_errno));
         if (addr->message != NULL)
-          fprintf(f, ":\n  %s", addr->message);
+          fprintf(f, ": %s", addr->message);
         else if (addr->basic_errno <= 0)
-          fprintf(f, ":\n  unknown error");
+          fprintf(f, ": unknown error");
         }
 
+      /* Show parents iff doing full info */
+
+      if (full_info) while (p != NULL)
+        {
+        fprintf(f, "%s\n    <-- %s", cr, p->address);
+        p = p->parent;
+        }
       fprintf(f, "%s\n", cr);
       }
+
     if (!full_info) return copy_error(vaddr, addr, DEFER);
       else if (yield == OK) yield = DEFER;
     }
 
   /* If we are handling EXPN, we do not want to continue to route beyond
-  the top level. */
+  the top level (whose address is in "address"). */
 
   else if (expn)
     {
@@ -1295,7 +1321,7 @@ while (addr_new != NULL)
          (addr_new != NULL &&            /* At least one new address AND */
           success_on_redirect)))         /* success_on_redirect is set */
       {
-      if (f != NULL) fprintf(f, "%s %s\n", address,
+      if (f != NULL) fprintf(f, "%s %s\n", show_address,
         address_test_mode? "is deliverable" : "verified");
 
       /* If we have carried on to verify a child address, we want the value
index 064b67d..c6c26cc 100644 (file)
@@ -6,3 +6,5 @@ f1:    :fail: bad user
 p:     userx
 pipe:  |/bin/nosuchfile
 file:  /tmp/junk
+v1:    a3, userx
+v2:    userx, a3
index 534f0d9..29a8d25 100644 (file)
@@ -40,3 +40,10 @@ vrfy <"smartuser.b@test.ex"@test.ex>
 vrfy <"smartuser.b@test.ex,a@test.ex"@test.ex>
 quit
 ****
+# Check fail/non-fail without and with -v
+0
+exim -bv v1 v2
+****
+2
+exim -v -bv v1 v2
+****
index 382af7b..9f1626a 100644 (file)
@@ -1,17 +1,13 @@
 > a@test.ex verified
-> b@test.ex failed to verify:
-  Unrouteable address
-> f@test.ex failed to verify:
-  bad user
+> b@test.ex failed to verify: Unrouteable address
+> f@test.ex failed to verify: bad user
 > p@test.ex verified
-> x@test.ex failed to verify:
-  Unrouteable address
+> x@test.ex failed to verify: Unrouteable address
 > y@test.ex verified
 > pipe@test.ex verified
 > file@test.ex verified
 > "smartuser.a@test.ex"@test.ex verified
-> "smartuser.b@test.ex"@test.ex failed to verify:
-  Unrouteable address
+> "smartuser.b@test.ex"@test.ex failed to verify: Unrouteable address
 > "smartuser.b@test.ex,a@test.ex"@test.ex verified
 > 
 220 the.local.host.name ESMTP Exim x.yz Tue, 2 Mar 1999 09:44:33 +0000\r
 550 <"smartuser.b@test.ex"@test.ex> Unrouteable address\r
 250 <"smartuser.b@test.ex,a@test.ex"@test.ex> is deliverable\r
 221 the.local.host.name closing connection\r
+v1@test.ex verified
+v2@test.ex verified
+a3@test.ex failed to verify: bad user
+    <-- v1@test.ex
+userx@test.ex
+    <-- v1@test.ex
+  router = all, transport = local_delivery
+a3@test.ex failed to verify: bad user
+    <-- v2@test.ex
+userx@test.ex   [duplicate, would not be delivered]
+    <-- v2@test.ex
+  router = all, transport = local_delivery