summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy Harris <jgh146exb@wizmail.org>2018-01-26 18:40:41 +0000
committerJeremy Harris <jgh146exb@wizmail.org>2018-01-26 20:05:56 +0000
commitf83a760f108f79279c210e208bb02c270569a951 (patch)
tree0e0e5540ae4296f6bae8d555397363b09fdd5548
parent06fdb9f73dedfffc8b8613017ec1bb23f970b246 (diff)
Cutthrough: fix for port-number defined by router. Bug 2229
-rw-r--r--doc/doc-txt/ChangeLog4
-rw-r--r--src/src/verify.c11
-rw-r--r--test/confs/540752
-rw-r--r--test/log/54076
-rw-r--r--test/scripts/5400-cutthrough/540740
-rw-r--r--test/stdout/540741
6 files changed, 150 insertions, 4 deletions
diff --git a/doc/doc-txt/ChangeLog b/doc/doc-txt/ChangeLog
index facdece83..7d577dbcb 100644
--- a/doc/doc-txt/ChangeLog
+++ b/doc/doc-txt/ChangeLog
@@ -67,6 +67,10 @@ JH/12 Bug 2230: Fix cutthrough routing for nonfirst messages in an initiating
multiple onward connections in sequence, handling cutthrough connection
for all multi-message initiating connections.
+JH/13 Bug 2229: Fix cutthrough routing for nonstandard port numbers defined by
+ routers. Previously, a multi-recipient message would fail to match the
+ onward-connection opened for the first recipient, and cause its closure.
+
Exim version 4.90
-----------------
diff --git a/src/src/verify.c b/src/src/verify.c
index dd5451848..eb479d440 100644
--- a/src/src/verify.c
+++ b/src/src/verify.c
@@ -388,18 +388,21 @@ if (addr->transport == cutthrough.addr.transport)
host_af = Ustrchr(host->address, ':') ? AF_INET6 : AF_INET;
- if (!smtp_get_interface(tf->interface, host_af, addr, &interface,
- US"callout") ||
- !smtp_get_port(tf->port, addr, &port, US"callout"))
+ if ( !smtp_get_interface(tf->interface, host_af, addr, &interface,
+ US"callout")
+ || !smtp_get_port(tf->port, addr, &port, US"callout")
+ )
log_write(0, LOG_MAIN|LOG_PANIC, "<%s>: %s", addr->address,
addr->message);
+ smtp_port_for_connect(host, port);
+
if ( ( interface == cutthrough.interface
|| ( interface
&& cutthrough.interface
&& Ustrcmp(interface, cutthrough.interface) == 0
) )
- && port == cutthrough.host.port
+ && host->port == cutthrough.host.port
)
{
uschar * resp = NULL;
diff --git a/test/confs/5407 b/test/confs/5407
new file mode 100644
index 000000000..0d41b0b7d
--- /dev/null
+++ b/test/confs/5407
@@ -0,0 +1,52 @@
+# Exim test configuration 5407
+
+# any options on the cutthrough_delivery control
+CONTROL=
+
+# optional verify-callout
+OPT=
+
+.include DIR/aux-var/std_conf_prefix
+
+primary_hostname = myhost.test.ex
+
+log_selector = +received_recipients
+queue_only
+
+# ----- Main settings -----
+
+domainlist local_domains = test.ex : *.test.ex
+
+acl_smtp_rcpt = ar
+
+
+# ----- ACLs -----
+
+begin acl
+
+ar:
+ accept
+ control = cutthrough_deliveryCONTROL
+ OPT
+ logwrite = rcpt for $local_part@$domain
+
+# ----- Routers -----
+
+begin routers
+
+all:
+ driver = manualroute
+ domains = ! +local_domains
+ route_list = * 127.0.0.1::PORT_S
+ self = send
+ transport = smtp
+
+
+# ----- Transports -----
+
+begin transports
+
+smtp:
+ driver = smtp
+
+# End
diff --git a/test/log/5407 b/test/log/5407
new file mode 100644
index 000000000..3b35ec632
--- /dev/null
+++ b/test/log/5407
@@ -0,0 +1,6 @@
+1999-03-02 09:44:33 rcpt for userx@domain.com
+1999-03-02 09:44:33 rcpt for usery@domain.com
+1999-03-02 09:44:33 10HmaX-0005vi-00 >> usery@domain.com R=all T=smtp H=127.0.0.1 [127.0.0.1] C="250 OK"
+1999-03-02 09:44:33 10HmaX-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 10HmaX-0005vi-00 <= CALLER@myhost.test.ex U=CALLER P=local-esmtp S=sss for userx@domain.com usery@domain.com
+1999-03-02 09:44:33 10HmaX-0005vi-00 Completed
diff --git a/test/scripts/5400-cutthrough/5407 b/test/scripts/5400-cutthrough/5407
new file mode 100644
index 000000000..08bc36f1f
--- /dev/null
+++ b/test/scripts/5400-cutthrough/5407
@@ -0,0 +1,40 @@
+# cutthrough_delivery multiple recipient; router specifying port
+need_ipv4
+munge loopback
+#
+# A two-RCPT message.
+# Both should get cuttthrough, still as one message
+server PORT_S
+220 ESMTP
+EHLO
+250 OK
+MAIL FROM:
+250 Sender OK
+RCPT TO:
+250 Recipient OK
+RCPT TO:
+250 Recipient OK
+DATA
+354 Send data
+.
+250 OK
+QUIT
+250 OK
+*eof
+****
+exim -bs
+EHLO myhost.test.ex
+MAIL FROM:<CALLER@myhost.test.ex>
+RCPT TO:<userx@domain.com>
+RCPT TO:<usery@domain.com>
+DATA
+
+.
+QUIT
+****
+#
+#
+#
+#
+#
+# End
diff --git a/test/stdout/5407 b/test/stdout/5407
new file mode 100644
index 000000000..90ae013fa
--- /dev/null
+++ b/test/stdout/5407
@@ -0,0 +1,41 @@
+220 myhost.test.ex ESMTP Exim x.yz Tue, 2 Mar 1999 09:44:33 +0000
+250-myhost.test.ex Hello CALLER at myhost.test.ex
+250-SIZE 52428800
+250-8BITMIME
+250-PIPELINING
+250 HELP
+250 OK
+250 Accepted
+250 Accepted
+354 Enter message, ending with "." on a line by itself
+250 OK id=10HmaX-0005vi-00
+221 myhost.test.ex closing connection
+
+******** SERVER ********
+Listening on port 1224 ...
+Connection request from [IP_LOOPBACK_ADDR]
+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
+RCPT TO:<usery@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 10HmaX-0005vi-00; Tue, 2 Mar 1999 09:44:33 +0000
+Message-Id: <E10HmaX-0005vi-00@myhost.test.ex>
+From: CALLER_NAME <CALLER@myhost.test.ex>
+Date: Tue, 2 Mar 1999 09:44:33 +0000
+
+.
+250 OK
+QUIT
+250 OK
+Expected EOF read from client
+End of script