Another bug in autoreply with bad address.
authorPhilip Hazel <ph10@hermes.cam.ac.uk>
Mon, 19 Dec 2005 12:25:21 +0000 (12:25 +0000)
committerPhilip Hazel <ph10@hermes.cam.ac.uk>
Mon, 19 Dec 2005 12:25:21 +0000 (12:25 +0000)
doc/doc-txt/ChangeLog
src/src/deliver.c
src/src/filter.c
src/src/structs.h

index e59a3f5410dcdf5d4a730dd56ebfde5ca9c48f0d..7122575dff498e4e572ccf6fb522664438b25021 100644 (file)
@@ -1,4 +1,4 @@
-$Cambridge: exim/doc/doc-txt/ChangeLog,v 1.279 2005/12/15 18:09:55 jetmore Exp $
+$Cambridge: exim/doc/doc-txt/ChangeLog,v 1.280 2005/12/19 12:25:21 ph10 Exp $
 
 Change log file for Exim from version 4.21
 -------------------------------------------
@@ -52,6 +52,14 @@ JJ/01 exipick: fixed bug where -b (brief) output option showed "Vars:"
 JJ/02 exipick: Added support for new ACL variable spool format introduced
       in 4.61-PH/06
 
+PH/10 Fixed another bug related to PH/04 above: if an incoming message had a
+      syntactically invalid From: or Reply-to: line, and a filter used this to
+      generate an autoreply, and therefore failed to obtain an address for the
+      autoreply, Exim could try to deliver to a non-existent relative file
+      name, causing unrelated and misleading errors. What now happens is that
+      it logs this as a hard delivery error, but does not attempt to create a
+      bounce message.
+
 
 Exim version 4.60
 -----------------
index 655ec9b8e7c76a367dc955a26783756a072015cb..c616752ff0b9a530649ba90a41c300d1142d4f53 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/deliver.c,v 1.24 2005/12/12 11:41:50 ph10 Exp $ */
+/* $Cambridge: exim/src/src/deliver.c,v 1.25 2005/12/19 12:25:21 ph10 Exp $ */
 
 /*************************************************
 *     Exim - an Internet mail transport agent    *
@@ -5175,7 +5175,20 @@ while (addr_new != NULL)           /* Loop until all addresses dealt with */
 
     if (testflag(addr, af_pfr))
       {
-      int offset = testflag(addr->parent, af_homonym)? 3:0;
+      /* If an autoreply in a filter could not generate a syntactically valid
+      address, give up forthwith. Set af_ignore_error so that we don't try to
+      generate a bounce. */
+
+      if (testflag(addr, af_bad_reply))
+        {
+        addr->basic_errno = ERRNO_BADADDRESS2;
+        addr->local_part = addr->address;
+        addr->message =
+          US"filter autoreply generated syntactically invalid recipient";
+        setflag(addr, af_ignore_error);
+        (void)post_process_one(addr, FAIL, LOG_MAIN, DTYPE_ROUTER, 0);
+        continue;   /* with the next new address */
+        }
 
       /* If two different users specify delivery to the same pipe or file or
       autoreply, there should be two different deliveries, so build a unique
@@ -5183,7 +5196,8 @@ while (addr_new != NULL)           /* Loop until all addresses dealt with */
       duplicate testing and recording delivery, and also for retrying. */
 
       addr->unique =
-        string_sprintf("%s:%s", addr->address, addr->parent->unique + offset);
+        string_sprintf("%s:%s", addr->address, addr->parent->unique +
+          (testflag(addr->parent, af_homonym)? 3:0));
 
       addr->address_retry_key = addr->domain_retry_key =
         string_sprintf("T:%s", addr->unique);
index 1773a8f2ff805c97e2dae540d18c5d2ff76034b5..e3d43b4168d0acf22c1abc560dc986c43b865a69 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/filter.c,v 1.7 2005/11/11 10:02:04 ph10 Exp $ */
+/* $Cambridge: exim/src/src/filter.c,v 1.8 2005/12/19 12:25:21 ph10 Exp $ */
 
 /*************************************************
 *     Exim - an Internet mail transport agent    *
@@ -2211,6 +2211,7 @@ while (commands != NULL)
       uschar *to = commands->args[mailarg_index_to].u;
       int size = 0;
       int ptr = 0;
+      int badflag = 0;
 
       if (to == NULL) to = expand_string(US"$reply_address");
       while (isspace(*to)) to++;
@@ -2283,11 +2284,15 @@ while (commands != NULL)
         while (isspace(*tt)) tt++;
         }
 
-      if (log_addr == NULL) log_addr = string_sprintf("invalid-to-line");
-        else log_addr[ptr] = 0;
+      if (log_addr == NULL)
+        {
+        log_addr = string_sprintf(">**bad-reply**");
+        badflag = af_bad_reply;
+        }
+      else log_addr[ptr] = 0;
 
       addr = deliver_make_addr(log_addr, FALSE);
-      setflag(addr, af_pfr);
+      setflag(addr, (af_pfr|badflag));
       if (commands->noerror) setflag(addr, af_ignore_error);
       addr->next = *generated;
       *generated = addr;
index f95c63ac0aeb0504ca0f3ff731e6a5e8c393d58c..2fd1bde2859923fb3e73d02e5beee96627fc3ba1 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/structs.h,v 1.7 2005/09/12 15:09:55 ph10 Exp $ */
+/* $Cambridge: exim/src/src/structs.h,v 1.8 2005/12/19 12:25:21 ph10 Exp $ */
 
 /*************************************************
 *     Exim - an Internet mail transport agent    *
@@ -503,6 +503,7 @@ typedef struct address_item_propagated {
 #define af_include_affixes     0x00800000 /* delivered with affixes in RCPT */
 #define af_cert_verified       0x01000000 /* delivered with verified TLS cert */
 #define af_pass_message        0x02000000 /* pass message in bounces */
+#define af_bad_reply           0x04000000 /* filter could not generate autoreply */
 
 /* These flags must be propagated when a child is created */