[exim-cvs] Callouts: filter smtp response for bad chars befo…

Top Page
Delete this message
Reply to this message
Author: Exim Git Commits Mailing List
Date:  
To: exim-cvs
Subject: [exim-cvs] Callouts: filter smtp response for bad chars before using in our smtp response. Bug 2409
Gitweb: https://git.exim.org/exim.git/commitdiff/7b564712ff3a235ce9ef42ffa4036023057f295e
Commit:     7b564712ff3a235ce9ef42ffa4036023057f295e
Parent:     6d95688d6a272297a6a47f2fd2695cc8e5b8b730
Author:     Jeremy Harris <jgh146exb@???>
AuthorDate: Sat Aug 3 22:22:58 2019 +0100
Committer:  Jeremy Harris <jgh146exb@???>
CommitDate: Sat Aug 3 22:22:58 2019 +0100


    Callouts: filter smtp response for bad chars before using in our smtp response.  Bug 2409
---
 doc/doc-txt/ChangeLog        |  3 +++
 src/src/verify.c             | 20 ++++++++++++++++++++
 test/log/0227                |  3 +++
 test/rejectlog/0227          |  3 +++
 test/scripts/0000-Basic/0227 | 34 +++++++++++++++++++++++++++++++++-
 test/stderr/0227             | 34 ++++++++++++++++++++++++++++++++++
 test/stdout/0227             | 31 +++++++++++++++++++++++++++++++
 7 files changed, 127 insertions(+), 1 deletion(-)


diff --git a/doc/doc-txt/ChangeLog b/doc/doc-txt/ChangeLog
index 9af9a97..7fca99b 100644
--- a/doc/doc-txt/ChangeLog
+++ b/doc/doc-txt/ChangeLog
@@ -161,6 +161,9 @@ JH/34 Fix crash after TLS shutdown.  When the TCP/SMTP channel was left open,
       an attempt to use a TLS library read routine dereffed a nul pointer,
       causing a segfault.


+JH/35 Bug 2409: filter out-of-spec chars from callout response before using
+      them in our smtp response.
+


 Exim version 4.92
 -----------------
diff --git a/src/src/verify.c b/src/src/verify.c
index 4422b4a..6057966 100644
--- a/src/src/verify.c
+++ b/src/src/verify.c
@@ -1001,6 +1001,26 @@ no_conn:
       string_sprintf("response to \"%s\" was: %s",
               big_buffer, string_printing(sx.buffer));


+    /* RFC 5321 section 4.2: the text portion of the response may have only
+    HT, SP, Printable US-ASCII.  Deal with awkward chars by cutting the
+    received message off before passing it onward.  Newlines are ok; they
+    just become a multiline response (but wrapped in the error code we
+    produce). */
+
+    for (uschar * s = sx.buffer;
+         *s && s < sx.buffer + sizeof(sx.buffer);
+         s++)
+      {
+      uschar c = *s;
+      if (c != '\t' && c != '\n' && (c < ' ' || c > '~'))
+        {
+        if (s - sx.buffer < sizeof(sx.buffer) - 12)
+          memcpy(s, "(truncated)", 12);
+        else
+          *s = '\0';
+        break;
+        }
+      }
     addr->user_message = options & vopt_is_recipient
       ? string_sprintf("Callout verification failed:\n%s", sx.buffer)
       : string_sprintf("Called:   %s\nSent:     %s\nResponse: %s",
diff --git a/test/log/0227 b/test/log/0227
index eeabf70..4ca892a 100644
--- a/test/log/0227
+++ b/test/log/0227
@@ -6,8 +6,11 @@
 1999-03-02 09:44:33 H=[V4NET.0.0.1] U=root F=<uncheckable2@localhost1> rejected RCPT <z@???>: Sender verify failed
 1999-03-02 09:44:33 H=[V4NET.0.0.1] U=root sender verify fail for <uncheckable@localhost1>: 127.0.0.1 [127.0.0.1] : response to "MAIL FROM:<>" was: 550-Multiline error for <>\n550 Here's the second line
 1999-03-02 09:44:33 H=[V4NET.0.0.1] U=root F=<uncheckable@localhost1> rejected RCPT <z@???>: Sender verify failed
+1999-03-02 09:44:33 H=[V4NET.0.0.1] U=root sender verify fail for <uncheckable2@localhost1>: 127.0.0.1 [127.0.0.1] : response to "MAIL FROM:<>" was: 550 Bad-char error for <> topbitchar:\200\377\377
+1999-03-02 09:44:33 H=[V4NET.0.0.1] U=root F=<uncheckable2@localhost1> rejected RCPT <z@???>: Sender verify failed
 1999-03-02 09:44:33 H=[V4NET.0.0.3] U=root F=<uncheckable@localhost1> rejected RCPT <z@???>: 127.0.0.1 [127.0.0.1] : SMTP error from remote mail server after RCPT TO:<z@???>: 550 Recipient not liked
 1999-03-02 09:44:33 H=[V4NET.0.0.3] U=root F=<uncheckable@localhost1> rejected RCPT <z@???>: 127.0.0.1 [127.0.0.1] : SMTP error from remote mail server after RCPT TO:<z@???>: 550-Recipient not liked on two lines\n550 Here's the second
+1999-03-02 09:44:33 H=[V4NET.0.0.3] U=root F=<uncheckable@localhost1> rejected RCPT <z@???>: 127.0.0.1 [127.0.0.1] : SMTP error from remote mail server after RCPT TO:<z@???>: 550 Recipient not liked, with bad char:\200\377\377
 1999-03-02 09:44:33 H=[V4NET.0.0.3] U=root F=<uncheckable@localhost1> temporarily rejected RCPT <z@???>: Could not complete recipient verify callout
 1999-03-02 09:44:33 10HmaX-0005vi-00 H=[V4NET.0.0.4] U=root F=<uncheckable@localhost1> rejected after DATA: there is no valid sender in any header line
 1999-03-02 09:44:33 10HmaY-0005vi-00 H=[V4NET.0.0.4] U=root F=<uncheckable@localhost1> rejected after DATA: there is no valid sender in any header line
diff --git a/test/rejectlog/0227 b/test/rejectlog/0227
index da5adfc..f24b9c1 100644
--- a/test/rejectlog/0227
+++ b/test/rejectlog/0227
@@ -6,8 +6,11 @@
 1999-03-02 09:44:33 H=[V4NET.0.0.1] U=root F=<uncheckable2@localhost1> rejected RCPT <z@???>: Sender verify failed
 1999-03-02 09:44:33 H=[V4NET.0.0.1] U=root sender verify fail for <uncheckable@localhost1>: 127.0.0.1 [127.0.0.1] : response to "MAIL FROM:<>" was: 550-Multiline error for <>\n550 Here's the second line
 1999-03-02 09:44:33 H=[V4NET.0.0.1] U=root F=<uncheckable@localhost1> rejected RCPT <z@???>: Sender verify failed
+1999-03-02 09:44:33 H=[V4NET.0.0.1] U=root sender verify fail for <uncheckable2@localhost1>: 127.0.0.1 [127.0.0.1] : response to "MAIL FROM:<>" was: 550 Bad-char error for <> topbitchar:\200\377\377
+1999-03-02 09:44:33 H=[V4NET.0.0.1] U=root F=<uncheckable2@localhost1> rejected RCPT <z@???>: Sender verify failed
 1999-03-02 09:44:33 H=[V4NET.0.0.3] U=root F=<uncheckable@localhost1> rejected RCPT <z@???>: 127.0.0.1 [127.0.0.1] : SMTP error from remote mail server after RCPT TO:<z@???>: 550 Recipient not liked
 1999-03-02 09:44:33 H=[V4NET.0.0.3] U=root F=<uncheckable@localhost1> rejected RCPT <z@???>: 127.0.0.1 [127.0.0.1] : SMTP error from remote mail server after RCPT TO:<z@???>: 550-Recipient not liked on two lines\n550 Here's the second
+1999-03-02 09:44:33 H=[V4NET.0.0.3] U=root F=<uncheckable@localhost1> rejected RCPT <z@???>: 127.0.0.1 [127.0.0.1] : SMTP error from remote mail server after RCPT TO:<z@???>: 550 Recipient not liked, with bad char:\200\377\377
 1999-03-02 09:44:33 H=[V4NET.0.0.3] U=root F=<uncheckable@localhost1> temporarily rejected RCPT <z@???>: Could not complete recipient verify callout
 1999-03-02 09:44:33 10HmaX-0005vi-00 H=[V4NET.0.0.4] U=root F=<uncheckable@localhost1> rejected after DATA: there is no valid sender in any header line
 Envelope-from: <uncheckable@localhost1>
diff --git a/test/scripts/0000-Basic/0227 b/test/scripts/0000-Basic/0227
index e53c1da..ac7bcb0 100644
--- a/test/scripts/0000-Basic/0227
+++ b/test/scripts/0000-Basic/0227
@@ -83,7 +83,7 @@ MAIL FROM
 QUIT
 250 OK
 ****
-# sender, err on mailfrom
+# sender, multiline err on mailfrom
 sudo exim -v -bs -oMa V4NET.0.0.1
 MAIL FROM:<uncheckable@localhost1>
 RCPT TO:<z@???>
@@ -94,6 +94,21 @@ server PORT_S
 EHLO
 250 OK
 MAIL FROM
+550 Bad-char error for <> topbitchar:\x80\xFF\xFF
+QUIT
+250 OK
+****
+# sender, err on mailfrom, with bad char
+sudo exim -v -bs -oMa V4NET.0.0.1
+MAIL FROM:<uncheckable2@localhost1>
+RCPT TO:<z@???>
+QUIT
+****
+server PORT_S
+220 Server ready
+EHLO
+250 OK
+MAIL FROM
 250 OK
 RCPT TO
 550 Recipient not liked
@@ -124,6 +139,23 @@ MAIL FROM:<uncheckable@localhost1>
 RCPT TO:<z@???>
 QUIT
 ****
+server PORT_S
+220 Server ready
+EHLO
+250 OK
+MAIL FROM
+250 OK
+RCPT TO
+550 Recipient not liked, with bad char:\x80\xFF\xFF
+QUIT
+250 OK
+****
+# recipient, refused, badchar in resp
+sudo exim -v -bs -oMa V4NET.0.0.3
+MAIL FROM:<uncheckable@localhost1>
+RCPT TO:<z@???>
+QUIT
+****
 # recipient, no conneect
 sudo exim -v -bs -oMa V4NET.0.0.3
 MAIL FROM:<uncheckable@localhost1>
diff --git a/test/stderr/0227 b/test/stderr/0227
index 768c810..36e6ee7 100644
--- a/test/stderr/0227
+++ b/test/stderr/0227
@@ -97,6 +97,23 @@ Connecting to 127.0.0.1 [127.0.0.1]:1224 ...  connected
   SMTP>> EHLO myhost.test.ex
   SMTP<< 250 OK
   SMTP>> MAIL FROM:<>
+  SMTP<< 550 Bad-char error for <> topbitchar:???
+  SMTP>> QUIT
+  SMTP<< 250 OK
+  SMTP(close)>>
+LOG: MAIN REJECT
+  H=[V4NET.0.0.1] U=root sender verify fail for <uncheckable2@localhost1>: 127.0.0.1 [127.0.0.1] : response to "MAIL FROM:<>" was: 550 Bad-char error for <> topbitchar:\200\377\377
+LOG: MAIN REJECT
+  H=[V4NET.0.0.1] U=root F=<uncheckable2@localhost1> rejected RCPT <z@???>: Sender verify failed
+LOG: smtp_connection MAIN
+  SMTP connection from root closed by QUIT
+LOG: smtp_connection MAIN
+  SMTP connection from root
+Connecting to 127.0.0.1 [127.0.0.1]:1224 ...  connected
+  SMTP<< 220 Server ready
+  SMTP>> EHLO myhost.test.ex
+  SMTP<< 250 OK
+  SMTP>> MAIL FROM:<>
   SMTP<< 250 OK
   SMTP>> RCPT TO:<z@???>
   SMTP<< 550 Recipient not liked
@@ -127,6 +144,23 @@ LOG: smtp_connection MAIN
   SMTP connection from root closed by QUIT
 LOG: smtp_connection MAIN
   SMTP connection from root
+Connecting to 127.0.0.1 [127.0.0.1]:1224 ...  connected
+  SMTP<< 220 Server ready
+  SMTP>> EHLO myhost.test.ex
+  SMTP<< 250 OK
+  SMTP>> MAIL FROM:<>
+  SMTP<< 250 OK
+  SMTP>> RCPT TO:<z@???>
+  SMTP<< 550 Recipient not liked, with bad char:???
+  SMTP>> QUIT
+  SMTP<< 250 OK
+  SMTP(close)>>
+LOG: MAIN REJECT
+  H=[V4NET.0.0.3] U=root F=<uncheckable@localhost1> rejected RCPT <z@???>: 127.0.0.1 [127.0.0.1] : SMTP error from remote mail server after RCPT TO:<z@???>: 550 Recipient not liked, with bad char:\200\377\377
+LOG: smtp_connection MAIN
+  SMTP connection from root closed by QUIT
+LOG: smtp_connection MAIN
+  SMTP connection from root
 Connecting to 127.0.0.1 [127.0.0.1]:1224 ...  failed: Connection refused
 Connecting to ip4.ip4.ip4.ip4 [ip4.ip4.ip4.ip4]:1224 ...  failed: Connection refused
 LOG: MAIN REJECT
diff --git a/test/stdout/0227 b/test/stdout/0227
index 9ee7e9f..ff5f135 100644
--- a/test/stdout/0227
+++ b/test/stdout/0227
@@ -38,6 +38,10 @@
 221 myhost.test.ex closing connection
 220 myhost.test.ex ESMTP Exim x.yz Tue, 2 Mar 1999 09:44:33 +0000
 250 OK
+550 Sender verify failed
+221 myhost.test.ex closing connection
+220 myhost.test.ex ESMTP Exim x.yz Tue, 2 Mar 1999 09:44:33 +0000
+250 OK
 550-Callout verification failed:
 550 550 Recipient not liked
 221 myhost.test.ex closing connection
@@ -49,6 +53,11 @@
 221 myhost.test.ex closing connection
 220 myhost.test.ex ESMTP Exim x.yz Tue, 2 Mar 1999 09:44:33 +0000
 250 OK
+550-Callout verification failed:
+550 550 Recipient not liked, with bad char:(truncated)
+221 myhost.test.ex closing connection
+220 myhost.test.ex ESMTP Exim x.yz Tue, 2 Mar 1999 09:44:33 +0000
+250 OK
 451 Could not complete recipient verify callout
 221 myhost.test.ex closing connection
 220 myhost.test.ex ESMTP Exim x.yz Tue, 2 Mar 1999 09:44:33 +0000
@@ -192,6 +201,16 @@ Connection request from [127.0.0.1]
 EHLO myhost.test.ex
 250 OK
 MAIL FROM:<>
+550 Bad-char error for <> topbitchar:???
+QUIT
+250 OK
+End of script
+Listening on port 1224 ... 
+Connection request from [127.0.0.1]
+220 Server ready
+EHLO myhost.test.ex
+250 OK
+MAIL FROM:<>
 250 OK
 RCPT TO:<z@???>
 550 Recipient not liked
@@ -218,6 +237,18 @@ EHLO myhost.test.ex
 250 OK
 MAIL FROM:<>
 250 OK
+RCPT TO:<z@???>
+550 Recipient not liked, with bad char:???
+QUIT
+250 OK
+End of script
+Listening on port 1224 ... 
+Connection request from [127.0.0.1]
+220 Server ready
+EHLO myhost.test.ex
+250 OK
+MAIL FROM:<>
+250 OK
 RCPT TO:<abcd@???>
 550 Not liked
 QUIT