Gitweb:
https://git.exim.org/exim.git/commitdiff/fd6e2d18420f43b0c956d943024cb462e1af6aa6
Commit: fd6e2d18420f43b0c956d943024cb462e1af6aa6
Parent: a40828c57d328cf42a956f650b1fd2456bf7b21a
Author: Jeremy Harris <jgh146exb@???>
AuthorDate: Tue May 28 00:26:48 2019 +0100
Committer: Jeremy Harris <jgh146exb@???>
CommitDate: Tue May 28 00:32:12 2019 +0100
PIPE_CONNECT: avoid using when the transport helo_data uses $sending_ip_address
---
doc/doc-txt/experimental-spec.txt | 3 +++
src/src/transports/smtp.c | 30 +++++++++++++++++++++---------
test/confs/4050 | 3 +++
test/log/4051 | 10 ++++++++++
test/scripts/4050-pipe-conn/4051 | 12 +++++++++++-
5 files changed, 48 insertions(+), 10 deletions(-)
diff --git a/doc/doc-txt/experimental-spec.txt b/doc/doc-txt/experimental-spec.txt
index 301152f..328d094 100644
--- a/doc/doc-txt/experimental-spec.txt
+++ b/doc/doc-txt/experimental-spec.txt
@@ -941,6 +941,9 @@ change.
NOTE: since the EHLO command must be constructed before the connection is
made it cannot depend on the interface IP address that will be used.
+The string "$sending_ip_address" is checked for; if it appears in helo_data
+and "def:sending_ip_address" does not, the facility is disabled.
+
Transport configurations should be checked for this. An example avoidance:
helo_data = ${if def:sending_ip_address \
diff --git a/src/src/transports/smtp.c b/src/src/transports/smtp.c
index 3ed2166..5c7b440 100644
--- a/src/src/transports/smtp.c
+++ b/src/src/transports/smtp.c
@@ -2106,17 +2106,29 @@ if (!continue_hostname)
sx->avoid_option = sx->peer_offered = smtp_peer_options = 0;
#ifdef EXPERIMENTAL_PIPE_CONNECT
- if (verify_check_given_host(CUSS &ob->hosts_pipe_connect, sx->conn_args.host) == OK)
- {
- sx->early_pipe_ok = TRUE;
- if ( read_ehlo_cache_entry(sx)
- && sx->ehlo_resp.cleartext_features & OPTION_EARLY_PIPE)
+ if ( verify_check_given_host(CUSS &ob->hosts_pipe_connect,
+ sx->conn_args.host) == OK)
+
+ /* We don't find out the local ip address until the connect, so if
+ the helo string might use it avoid doing early-pipelining. */
+
+ if ( !sx->helo_data
+ || !Ustrstr(sx->helo_data, "$sending_ip_address")
+ || Ustrstr(sx->helo_data, "def:sending_ip_address")
+ )
{
- DEBUG(D_transport) debug_printf("Using cached cleartext PIPE_CONNECT\n");
- sx->early_pipe_active = TRUE;
- sx->peer_offered = sx->ehlo_resp.cleartext_features;
+ sx->early_pipe_ok = TRUE;
+ if ( read_ehlo_cache_entry(sx)
+ && sx->ehlo_resp.cleartext_features & OPTION_EARLY_PIPE)
+ {
+ DEBUG(D_transport)
+ debug_printf("Using cached cleartext PIPE_CONNECT\n");
+ sx->early_pipe_active = TRUE;
+ sx->peer_offered = sx->ehlo_resp.cleartext_features;
+ }
}
- }
+ else DEBUG(D_transport)
+ debug_printf("helo needs $sending_ip_address\n");
if (sx->early_pipe_active)
sx->outblock.conn_args = &sx->conn_args;
diff --git a/test/confs/4050 b/test/confs/4050
index 7cddca9..c26b7a9 100644
--- a/test/confs/4050
+++ b/test/confs/4050
@@ -59,6 +59,9 @@ smtp:
driver = smtp
hosts_try_fastopen = :
hosts_pipe_connect = CONTROL
+.ifdef HELO_MSG
+ helo_data = HELO_MSG
+.endif
max_rcpt = 1
#
diff --git a/test/log/4051 b/test/log/4051
index b1d8144..c332087 100644
--- a/test/log/4051
+++ b/test/log/4051
@@ -18,6 +18,11 @@
1999-03-02 09:44:33 10HmbD-0005vi-00 => clientno@??? R=client T=smtp H=127.0.0.1 [127.0.0.1] L C="250 OK id=10HmbE-0005vi-00"
1999-03-02 09:44:33 10HmbD-0005vi-00 Completed
1999-03-02 09:44:33 End queue run: pid=pppp
+1999-03-02 09:44:33 10HmbF-0005vi-00 <= CALLER@??? U=CALLER P=local S=sss for helo_data@???
+1999-03-02 09:44:33 Start queue run: pid=pppp
+1999-03-02 09:44:33 10HmbF-0005vi-00 => helo_data@??? R=client T=smtp H=127.0.0.1 [127.0.0.1] L C="250 OK id=10HmbG-0005vi-00"
+1999-03-02 09:44:33 10HmbF-0005vi-00 Completed
+1999-03-02 09:44:33 End queue run: pid=pppp
******** SERVER ********
1999-03-02 09:44:33 exim x.yz daemon started: pid=pppp, no queue runs, listening for SMTP on port PORT_D
@@ -42,3 +47,8 @@
1999-03-02 09:44:33 10HmbE-0005vi-00 => :blackhole: <clientno@???> R=server
1999-03-02 09:44:33 10HmbE-0005vi-00 Completed
1999-03-02 09:44:33 End queue run: pid=pppp
+1999-03-02 09:44:33 10HmbG-0005vi-00 <= CALLER@??? H=(127.0.0.1) [127.0.0.1] P=esmtp L. S=sss id=E10HmbF-0005vi-00@??? for helo_data@???
+1999-03-02 09:44:33 Start queue run: pid=pppp
+1999-03-02 09:44:33 10HmbG-0005vi-00 => :blackhole: <helo_data@???> R=server
+1999-03-02 09:44:33 10HmbG-0005vi-00 Completed
+1999-03-02 09:44:33 End queue run: pid=pppp
diff --git a/test/scripts/4050-pipe-conn/4051 b/test/scripts/4050-pipe-conn/4051
index 45e4b74..dd5f4c7 100644
--- a/test/scripts/4050-pipe-conn/4051
+++ b/test/scripts/4050-pipe-conn/4051
@@ -54,6 +54,16 @@ exim -DNOTDAEMON -DSERVER=server -q
****
#
#
-killdaemon
+# Check that client doesn't try when transport uses $sending_ip_address in
+# helo_data
+exim helo_data@???
+Subject test 5
+****
+exim -DCONTROL=127.0.0.1 -DHELO_MSG='$sending_ip_address' -q
+****
+exim -DNOTDAEMON -DSERVER=server -q
+****
+#
#
+killdaemon
no_msglog_check