Add warning about missing colon to invalid expansion when it involved
authorPhilip Hazel <ph10@hermes.cam.ac.uk>
Tue, 31 Oct 2006 14:26:34 +0000 (14:26 +0000)
committerPhilip Hazel <ph10@hermes.cam.ac.uk>
Tue, 31 Oct 2006 14:26:34 +0000 (14:26 +0000)
${if def:h_xxx (overlooked previously).

doc/doc-txt/ChangeLog
src/src/expand.c
test/scripts/0000-Basic/0002
test/stdout/0002

index 5f8d427..b3ac931 100644 (file)
@@ -1,4 +1,4 @@
-$Cambridge: exim/doc/doc-txt/ChangeLog,v 1.421 2006/10/31 12:16:26 ph10 Exp $
+$Cambridge: exim/doc/doc-txt/ChangeLog,v 1.422 2006/10/31 14:26:34 ph10 Exp $
 
 Change log file for Exim from version 4.21
 -------------------------------------------
@@ -222,6 +222,10 @@ PH/31 Installed Andrew Findlay's patch to close the writing end of the socket
 
 PH/32 Added some extra debug output when updating a wait-xxx database.
 
+PH/33 The hint "could be header name not terminated by colon", which has been
+      given for certain expansion errors for a long time, was not being given
+      for the ${if def:h_colon_omitted{...  case.
+
 
 Exim version 4.63
 -----------------
index 4943bcb..b91f031 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/expand.c,v 1.67 2006/10/31 11:14:18 ph10 Exp $ */
+/* $Cambridge: exim/src/src/expand.c,v 1.68 2006/10/31 14:26:34 ph10 Exp $ */
 
 /*************************************************
 *     Exim - an Internet mail transport agent    *
@@ -1689,7 +1689,9 @@ switch(cond_type)
 
   s = read_name(name, 256, s+1, US"_");
 
-  /* Test for a header's existence */
+  /* Test for a header's existence. If the name contains a closing brace
+  character, this may be a user error where the terminating colon has been
+  omitted. Set a flag to adjust a subsequent error message in this case. */
 
   if (Ustrncmp(name, "h_", 2) == 0 ||
       Ustrncmp(name, "rh_", 3) == 0 ||
@@ -1699,6 +1701,7 @@ switch(cond_type)
       Ustrncmp(name, "bheader_", 8) == 0)
     {
     s = read_header_name(name, 256, s);
+    if (Ustrchr(name, '}') != NULL) malformed_header = TRUE;
     if (yield != NULL) *yield =
       (find_header(name, TRUE, NULL, FALSE, NULL) != NULL) == testfor;
     }
@@ -2973,7 +2976,7 @@ while (*s != 0)
       value = find_header(name, FALSE, &newsize, want_raw, charset);
 
       /* If we didn't find the header, and the header contains a closing brace
-      characters, this may be a user error where the terminating colon
+      character, this may be a user error where the terminating colon
       has been omitted. Set a flag to adjust the error message in this case.
       But there is no error here - nothing gets inserted. */
 
index 19e1e85..c975771 100644 (file)
@@ -578,6 +578,8 @@ ${if and {xyz}{a}{b}}
 ${if and {{xya}}{a}{b}}
 ${if and {{${lookup{x}lsearch{/a/b}}}}{a}{b}}
 ${if eq {$h_xyz}{1}{y}{n}}
+${if eq {$h_xyz:}{1}{y}{n}
+${if def:h_xyz}{y}{n}}
 ${if or {eq {}{}{yes}{no}}
 ${if or {{eq {}{}{yes}{no}}
 ${if or {{eq {}{}}{yes}{no}}
index 96d4047..188a975 100644 (file)
@@ -555,6 +555,8 @@ xyz
 > Failed: unknown condition "xya" inside "and{...}" condition
 > Failed: condition name expected, but found "${lookup{x}lsear" inside "and{...}" condition
 > Failed: missing } at end of string - could be header name not terminated by colon
+> Failed: missing or misplaced { or }
+> Failed: missing or misplaced { or } - could be header name not terminated by colon
 > Failed: each subcondition inside an "or{...}" condition must be in its own {}
 > Failed: missing } at end of condition inside "or" group
 > Failed: unknown condition "yes" inside "or{...}" condition