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