Repair manualroute transport name not-last option
authorPhil Pennock <pdp@exim.org>
Mon, 26 Jun 2017 22:39:29 +0000 (18:39 -0400)
committerPhil Pennock <pdp@exim.org>
Mon, 26 Jun 2017 22:44:33 +0000 (18:44 -0400)
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.

doc/doc-docbook/spec.xfpt
doc/doc-txt/ChangeLog
src/src/routers/manualroute.c

index 4a239b73c9c33d58edaeb918bf1735b32c28cd7f..aab8c00d5ba8968d5072669ed23516a195d0c7f5 100644 (file)
@@ -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
index 336935329246f1a89b68d935cf6faf892deb55d4..03ec157ecf7a19c578efb73d521afa1fa44bedb1 100644 (file)
@@ -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
 -----------------
index 95c69328d664cc8e4f1166e28429536d344d3bd0..31185e160d4babdeb364370a84866e236611d111 100644 (file)
@@ -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;