Cutthrough: Fix bug with dot-only line
authorJeremy Harris <jgh146exb@wizmail.org>
Thu, 21 Jan 2016 15:37:08 +0000 (15:37 +0000)
committerJeremy Harris <jgh146exb@wizmail.org>
Fri, 22 Jan 2016 10:53:09 +0000 (10:53 +0000)
doc/doc-txt/ChangeLog
src/src/receive.c
test/log/5400
test/scripts/5400-cutthrough/5400
test/stdout/5400

index ad5c5a349e33d3dde42921417e1480c79fd2cdff..c4a2f00ce8c9a44fc860e319c8b442e52eb5e212 100644 (file)
@@ -156,6 +156,14 @@ JH/36 Bug 1778: longstanding bug in memory use by the ${run } expansion: A fresh
 JH/37 Bug 1769: Permit a VRFY ACL to override the default 252 response,
       and to use the domains and local_parts ACL conditions.
 
+JH/38 Fix cutthrough bug with body lines having a single dot. The dot was
+      incorrectly not doubled on cutthrough transmission, hence seen as a
+      body-termination at the receiving system - resulting in truncated mails.
+      Commonly the sender saw a TCP-level error, and retransmitted the nessage
+      via the normal store-and-forward channel. This could result in duplicates
+      received - but deduplicating mailstores were liable to retain only the
+      initial truncated version.
+
 
 Exim version 4.86
 -----------------
index f2a94e0f85128ca18e3ae69e692a0b89b1c6a69c..a479e12cda152c7ffe036f1b5637b8902796384b 100644 (file)
@@ -835,7 +835,15 @@ while ((ch = (receive_getc)()) != EOF)
       ch_state = 4;
       continue;
       }
-    ch_state = 1;                       /* The dot itself is removed */
+    /* The dot was removed at state 3. For a doubled dot, here, reinstate
+    it to cutthrough. The current ch, dot or not, is passed both to cutthrough
+    and to file below. */
+    if (ch == '.')
+      {
+      uschar c= ch;
+      (void) cutthrough_puts(&c, 1);
+      }
+    ch_state = 1;
     break;
 
     case 4:                             /* After [CR] LF . CR */
index a72dfeeadf5cc320f4b08b61e7b7f84a52b63dbe..f8d7c9e8ff9429dae8a4f145e6fad73eac342e26 100644 (file)
@@ -52,3 +52,7 @@
 1999-03-02 09:44:33 10HmbG-0005vi-00 >> userx@localhost4.test.ex R=dns T=smtp H=localhost4.test.ex [127.0.0.1] C="250 OK"
 1999-03-02 09:44:33 10HmbG-0005vi-00 <= CALLER@myhost.test.ex U=CALLER P=local-esmtp S=sss for userx@localhost4.test.ex usery@thishost.test.ex
 1999-03-02 09:44:33 10HmbG-0005vi-00 Completed
+1999-03-02 09:44:33 rcpt for userx@domain.com
+1999-03-02 09:44:33 10HmbH-0005vi-00 >> userx@domain.com R=all T=smtp H=127.0.0.1 [127.0.0.1] C="250 OK"
+1999-03-02 09:44:33 10HmbH-0005vi-00 <= CALLER@myhost.test.ex U=CALLER P=local-esmtp S=sss for userx@domain.com
+1999-03-02 09:44:33 10HmbH-0005vi-00 Completed
index 5344ba51c6db4cd77ce0bbb5bd3f42be580a2405..109b43928a4d9daa455c35f0010f2dbfc921f15b 100644 (file)
@@ -414,5 +414,39 @@ QUIT
 #
 #
 #
+# data having line with (logical, doubled on wire) single dot
+server PORT_S
+220 ESMTP
+EHLO
+250 OK
+MAIL FROM:
+250 Sender OK
+RCPT TO:
+250 Recipient OK
+DATA
+354 Send data
+.
+250 OK
+QUIT
+250 OK
+****
+exim -bs -odf
+EHLO myhost.test.ex
+MAIL FROM:<CALLER@myhost.test.ex>
+RCPT TO:<userx@domain.com>
+DATA
+Subject: singledot test
+
+This data has a line with a single dot... next:
+..
+and this is the line right after.
+Next we have a line with a leading dot:
+..test
+and this is the next line.
+
+.
+QUIT
+****
+#
 #
 # End
index 05f2ef037735871fb2c1171f8ff61b7a720503f4..20de2df0981f1bebb11e1853cf900a8861dbcdfe 100644 (file)
 354 Enter message, ending with "." on a line by itself\r
 250 OK id=10HmbG-0005vi-00\r
 221 myhost.test.ex closing connection\r
+220 myhost.test.ex ESMTP Exim x.yz Tue, 2 Mar 1999 09:44:33 +0000\r
+250-myhost.test.ex Hello CALLER at myhost.test.ex\r
+250-SIZE 52428800\r
+250-8BITMIME\r
+250-PIPELINING\r
+250 HELP\r
+250 OK\r
+250 Accepted\r
+354 Enter message, ending with "." on a line by itself\r
+250 OK id=10HmbH-0005vi-00\r
+221 myhost.test.ex closing connection\r
 
 ******** SERVER ********
 Listening on port 1224 ... 
@@ -508,3 +519,37 @@ Date: Tue, 2 Mar 1999 09:44:33 +0000
 QUIT
 250 OK
 End of script
+Listening on port 1224 ... 
+Connection request from [ip4.ip4.ip4.ip4]
+220 ESMTP
+EHLO myhost.test.ex
+250 OK
+MAIL FROM:<CALLER@myhost.test.ex>
+250 Sender OK
+RCPT TO:<userx@domain.com>
+250 Recipient OK
+DATA
+354 Send data
+Received: from CALLER (helo=myhost.test.ex)
+       by myhost.test.ex with local-esmtp (Exim x.yz)
+       (envelope-from <CALLER@myhost.test.ex>)
+       id 10HmbH-0005vi-00
+       for userx@domain.com; Tue, 2 Mar 1999 09:44:33 +0000
+Subject: singledot test
+Message-Id: <E10HmbH-0005vi-00@myhost.test.ex>
+From: CALLER_NAME <CALLER@myhost.test.ex>
+Date: Tue, 2 Mar 1999 09:44:33 +0000
+X-hdr-rtr-new: +++
+
+This data has a line with a single dot... next:
+..
+and this is the line right after.
+Next we have a line with a leading dot:
+..test
+and this is the next line.
+
+.
+250 OK
+QUIT
+250 OK
+End of script