DKIM: Fix signing for body lines starting with a pair of dots. Bug 2284
authorJeremy Harris <jgh146exb@wizmail.org>
Thu, 21 Jun 2018 16:03:38 +0000 (17:03 +0100)
committerJeremy Harris <jgh146exb@wizmail.org>
Thu, 21 Jun 2018 16:09:41 +0000 (17:09 +0100)
Broken-by: 42055a3385
doc/doc-txt/ChangeLog
src/src/dkim_transport.c
test/log/4520
test/mail/4520.a
test/scripts/4500-DKIM/4520

index 5303b2d50a61bc78a6b3c5fbedb4644599f52c2b..96508ff3f2c6abeefc0827ab582c17bbd3b845cb 100644 (file)
@@ -66,6 +66,8 @@ JH/13 For receent Openssl versions (1.1 onward) use modern generic protocol
       now-deprecated earlier definitions used only specified the range up to TLS
       1.2 (in the older-version library docs).
 
       now-deprecated earlier definitions used only specified the range up to TLS
       1.2 (in the older-version library docs).
 
+JH/14 Bug 2284: Fix DKIM signing for body lines starting with a pair of dots.
+
 
 Exim version 4.91
 -----------------
 
 Exim version 4.91
 -----------------
index c35ba1eff1c2059e821202b4b214619d3a705dcb..0e9c3818cddbcdbf63e44c665a5ee73f96fa1e13 100644 (file)
@@ -154,7 +154,10 @@ if (!rc) return FALSE;
 arc_sign_init();
 #endif
 
 arc_sign_init();
 #endif
 
-dkim->dot_stuffed = !!(save_options & topt_end_dot);
+/* The dotstuffed status of the datafile depends on whether it was stored
+in wireformat. */
+
+dkim->dot_stuffed = spool_file_wireformat;
 if (!(dkim_signature = dkim_exim_sign(deliver_datafile, SPOOL_DATA_START_OFFSET,
                                    hdrs, dkim, &errstr)))
   if (!(rc = dkt_sign_fail(dkim, &errno)))
 if (!(dkim_signature = dkim_exim_sign(deliver_datafile, SPOOL_DATA_START_OFFSET,
                                    hdrs, dkim, &errstr)))
   if (!(rc = dkt_sign_fail(dkim, &errno)))
@@ -272,7 +275,9 @@ if (!rc)
 arc_sign_init();
 #endif
 
 arc_sign_init();
 #endif
 
-/* Feed the file to the goats^W DKIM lib */
+/* Feed the file to the goats^W DKIM lib.  At this point the dotstuffed
+status of the file depends on the output of transport_write_message() just
+above, which should be the result of the end_dot flag in tctx->options. */
 
 dkim->dot_stuffed = !!(options & topt_end_dot);
 if (!(dkim_signature = dkim_exim_sign(dkim_fd, 0, NULL, dkim, &errstr)))
 
 dkim->dot_stuffed = !!(options & topt_end_dot);
 if (!(dkim_signature = dkim_exim_sign(dkim_fd, 0, NULL, dkim, &errstr)))
index d583933102e5d693a3256918cb554ba012d5b007..f49af25bf220ab8f3585448c2cd06017b4731d3a 100644 (file)
 1999-03-02 09:44:33 10HmbJ-0005vi-00 => d@test.ex R=client T=send_to_server H=ip4.ip4.ip4.ip4 [ip4.ip4.ip4.ip4] C="250 OK id=10HmbK-0005vi-00"
 1999-03-02 09:44:33 10HmbJ-0005vi-00 Completed
 1999-03-02 09:44:33 10HmbL-0005vi-00 <= CALLER@myhost.test.ex U=CALLER P=local S=sss
 1999-03-02 09:44:33 10HmbJ-0005vi-00 => d@test.ex R=client T=send_to_server H=ip4.ip4.ip4.ip4 [ip4.ip4.ip4.ip4] C="250 OK id=10HmbK-0005vi-00"
 1999-03-02 09:44:33 10HmbJ-0005vi-00 Completed
 1999-03-02 09:44:33 10HmbL-0005vi-00 <= CALLER@myhost.test.ex U=CALLER P=local S=sss
-1999-03-02 09:44:33 10HmbL-0005vi-00 => a@test.ex R=client T=send_to_server H=ip4.ip4.ip4.ip4 [ip4.ip4.ip4.ip4] C="250 OK id=10HmbM-0005vi-00"
+1999-03-02 09:44:33 10HmbL-0005vi-00 => e@test.ex R=client T=send_to_server H=ip4.ip4.ip4.ip4 [ip4.ip4.ip4.ip4] C="250 OK id=10HmbM-0005vi-00"
 1999-03-02 09:44:33 10HmbL-0005vi-00 Completed
 1999-03-02 09:44:33 10HmbL-0005vi-00 Completed
+1999-03-02 09:44:33 10HmbN-0005vi-00 <= CALLER@myhost.test.ex U=CALLER P=local S=sss
+1999-03-02 09:44:33 10HmbN-0005vi-00 => f@test.ex R=client T=send_to_server H=ip4.ip4.ip4.ip4 [ip4.ip4.ip4.ip4] C="250 OK id=10HmbO-0005vi-00"
+1999-03-02 09:44:33 10HmbN-0005vi-00 Completed
 
 ******** SERVER ********
 1999-03-02 09:44:33 exim x.yz daemon started: pid=pppp, no queue runs, listening for SMTP on port 1225
 
 ******** SERVER ********
 1999-03-02 09:44:33 exim x.yz daemon started: pid=pppp, no queue runs, listening for SMTP on port 1225
 1999-03-02 09:44:33 rcpt acl: macro: From:Sender:Reply-To:Subject:Date:Message-ID:To:Cc:MIME-Version:Content-Type:Content-Transfer-Encoding:Content-ID:Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:In-Reply-To:References:List-Id:List-Help:List-Unsubscribe:List-Subscribe:List-Post:List-Owner:List-Archive
 1999-03-02 09:44:33 10HmbM-0005vi-00 data acl: dkim status 
 1999-03-02 09:44:33 10HmbM-0005vi-00 <= CALLER@myhost.test.ex H=the.local.host.name (myhost.test.ex) [ip4.ip4.ip4.ip4] P=esmtp S=sss id=E10HmbL-0005vi-00@myhost.test.ex
 1999-03-02 09:44:33 rcpt acl: macro: From:Sender:Reply-To:Subject:Date:Message-ID:To:Cc:MIME-Version:Content-Type:Content-Transfer-Encoding:Content-ID:Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:In-Reply-To:References:List-Id:List-Help:List-Unsubscribe:List-Subscribe:List-Post:List-Owner:List-Archive
 1999-03-02 09:44:33 10HmbM-0005vi-00 data acl: dkim status 
 1999-03-02 09:44:33 10HmbM-0005vi-00 <= CALLER@myhost.test.ex H=the.local.host.name (myhost.test.ex) [ip4.ip4.ip4.ip4] P=esmtp S=sss id=E10HmbL-0005vi-00@myhost.test.ex
-1999-03-02 09:44:33 10HmbM-0005vi-00 => a <a@test.ex> R=server_store T=file
+1999-03-02 09:44:33 10HmbM-0005vi-00 => e <e@test.ex> R=server_store T=file
 1999-03-02 09:44:33 10HmbM-0005vi-00 Completed
 1999-03-02 09:44:33 10HmbM-0005vi-00 Completed
+1999-03-02 09:44:33 rcpt acl: macro: From:Sender:Reply-To:Subject:Date:Message-ID:To:Cc:MIME-Version:Content-Type:Content-Transfer-Encoding:Content-ID:Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:In-Reply-To:References:List-Id:List-Help:List-Unsubscribe:List-Subscribe:List-Post:List-Owner:List-Archive
+1999-03-02 09:44:33 10HmbO-0005vi-00 dkim_acl: signer: test.ex bits: 1024 h=From
+1999-03-02 09:44:33 10HmbO-0005vi-00 DKIM: d=test.ex s=sel c=relaxed/relaxed a=rsa-sha256 b=1024 [verification succeeded]
+1999-03-02 09:44:33 10HmbO-0005vi-00 data acl: dkim status pass
+1999-03-02 09:44:33 10HmbO-0005vi-00 <= CALLER@myhost.test.ex H=the.local.host.name (myhost.test.ex) [ip4.ip4.ip4.ip4] P=esmtp S=sss id=E10HmbN-0005vi-00@myhost.test.ex
+1999-03-02 09:44:33 10HmbO-0005vi-00 => f <f@test.ex> R=server_store T=file
+1999-03-02 09:44:33 10HmbO-0005vi-00 Completed
index f33057d4db3c79207973ff20763c68428104a267..430033f9cd01673adc9382468aafb2a760a52911 100644 (file)
@@ -21,20 +21,3 @@ Date: Tue, 2 Mar 1999 09:44:33 +0000
 
 content
 
 
 content
 
-From CALLER@myhost.test.ex Tue Mar 02 09:44:33 1999
-Received: from the.local.host.name ([ip4.ip4.ip4.ip4] helo=myhost.test.ex)
-       by myhost.test.ex with esmtp (Exim x.yz)
-       (envelope-from <CALLER@myhost.test.ex>)
-       id 10HmbM-0005vi-00
-       for a@test.ex; Tue, 2 Mar 1999 09:44:33 +0000
-Received: from CALLER by myhost.test.ex with local (Exim x.yz)
-       (envelope-from <CALLER@myhost.test.ex>)
-       id 10HmbL-0005vi-00
-       for a@test.ex; Tue, 2 Mar 1999 09:44:33 +0000
-From: nobody@example.com
-Message-Id: <E10HmbL-0005vi-00@myhost.test.ex>
-Sender: CALLER_NAME <CALLER@myhost.test.ex>
-Date: Tue, 2 Mar 1999 09:44:33 +0000
-
-content
-
index 8e60f4bec0ebe398a0eb2d44e483329170033ac2..8f962a001cebd1be91fcc7a235f72d841ccdc45b 100644 (file)
@@ -67,12 +67,19 @@ content
 ****
 #
 # check that an empty dkim_privatekey overrides dkim_strict
 ****
 #
 # check that an empty dkim_privatekey overrides dkim_strict
-exim -DOPT=From -DSTRICT=true -DSELECTOR=none -odf a@test.ex
+exim -DOPT=From -DSTRICT=true -DSELECTOR=none -odf e@test.ex
 From: nobody@example.com
 
 content
 ****
 #
 From: nobody@example.com
 
 content
 ****
 #
+# single header signed, body line starting with dot
+exim -DOPT=From -odf f@test.ex
+From: nobody@example.com
+
+..content
+****
+#
 millisleep 500
 killdaemon
 no_msglog_check
 millisleep 500
 killdaemon
 no_msglog_check