summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhil Pennock <pdp@exim.org>2017-06-26 18:39:29 -0400
committerPhil Pennock <pdp@exim.org>2017-06-26 18:44:33 -0400
commit833c70bc6dc0b85ea942bb127515d582a91a6ed7 (patch)
tree903a5bb15d683c5b244f60c2af68d72023b8727f
parentaf542dcfa62fc2341e8253f10c5c778b887444b9 (diff)
Repair manualroute transport name not-last option
Commit 55414b25b did const-ification surgery which removed the old "temporarily drop a NUL in here" anti-pattern, but one of the Ustrcmp->Ustrncmp conversions was missed, for transport-name comparison. As a result, since Exim 4.85, we've had an undocumented requirement-by-bug that the transport name be the last such option given. Restore old behaviour. Still missing a test-case to deter regression.
-rw-r--r--doc/doc-docbook/spec.xfpt4
-rw-r--r--doc/doc-txt/ChangeLog3
-rw-r--r--src/src/routers/manualroute.c2
3 files changed, 8 insertions, 1 deletions
diff --git a/doc/doc-docbook/spec.xfpt b/doc/doc-docbook/spec.xfpt
index 4a239b73c..aab8c00d5 100644
--- a/doc/doc-docbook/spec.xfpt
+++ b/doc/doc-docbook/spec.xfpt
@@ -19469,6 +19469,10 @@ instead of TRY_AGAIN. That is why the default action is to try a DNS
lookup first. Only if that gives a definite &"no such host"& is the local
function called.
+&*Compatibility*&: From Exim 4.85 until fixed for 4.90, there was an
+inadvertent constraint that a transport name as an option had to be the last
+option specified.
+
If no IP address for a host can be found, what happens is controlled by the
diff --git a/doc/doc-txt/ChangeLog b/doc/doc-txt/ChangeLog
index 336935329..03ec157ec 100644
--- a/doc/doc-txt/ChangeLog
+++ b/doc/doc-txt/ChangeLog
@@ -109,6 +109,9 @@ JH/15 Fix a crash in the smtp transport caused when two hosts in succession
JH/16 Fix logging of delivery remote port, when specified by router, under
callout/hold.
+PP/06 Repair manualroute's ability to take options before hostnames.
+ Fixes bug 2140.
+
Exim version 4.89
-----------------
diff --git a/src/src/routers/manualroute.c b/src/src/routers/manualroute.c
index 95c69328d..31185e160 100644
--- a/src/src/routers/manualroute.c
+++ b/src/src/routers/manualroute.c
@@ -333,7 +333,7 @@ while (*options != 0)
{
transport_instance *t;
for (t = transports; t != NULL; t = t->next)
- if (Ustrcmp(t->name, s) == 0)
+ if (Ustrncmp(t->name, s, n) == 0)
{
transport = t;
individual_transport_set = TRUE;