Diagnose an error for "seen", "unseen", or "noerror" if not followed by
authorPhilip Hazel <ph10@hermes.cam.ac.uk>
Fri, 7 Jul 2006 14:36:04 +0000 (14:36 +0000)
committerPhilip Hazel <ph10@hermes.cam.ac.uk>
Fri, 7 Jul 2006 14:36:04 +0000 (14:36 +0000)
a command.

doc/doc-txt/ChangeLog
src/src/filter.c
test/aux-fixed/0037.f-8 [new file with mode: 0644]
test/aux-fixed/0037.f-9 [new file with mode: 0644]
test/scripts/0000-Basic/0037
test/stdout/0037

index 2ab45d7..90a8a83 100644 (file)
@@ -1,4 +1,4 @@
-$Cambridge: exim/doc/doc-txt/ChangeLog,v 1.371 2006/07/07 13:54:32 ph10 Exp $
+$Cambridge: exim/doc/doc-txt/ChangeLog,v 1.372 2006/07/07 14:36:04 ph10 Exp $
 
 Change log file for Exim from version 4.21
 -------------------------------------------
@@ -86,6 +86,9 @@ PH/13 If write_rejectlog was set false when logging was sent to syslog with
 PH/14 In the default configuration, change the use of "message" in ACL warn
       statements to "add_header".
 
+PH/15 Diagnose a filter syntax error for "seen", "unseen", or "noerror" if not
+      not followed by a command (e.g. "seen endif").
+
 
 Exim version 4.62
 -----------------
index a924def..b149620 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/filter.c,v 1.10 2006/06/27 14:34:26 ph10 Exp $ */
+/* $Cambridge: exim/src/src/filter.c,v 1.11 2006/07/07 14:36:04 ph10 Exp $ */
 
 /*************************************************
 *     Exim - an Internet mail transport agent    *
@@ -1044,6 +1044,13 @@ switch (command)
   case elif_command:
   case else_command:
   case endif_command:
+  if (seen_force || noerror_force)
+    {
+    *error_pointer = string_sprintf("\"seen\", \"unseen\", or \"noerror\" "
+      "near line %d is not followed by a command", line_number);
+    yield = FALSE;
+    }
+
   if (expect_endif > 0)
     had_else_endif = (command == elif_command)? had_elif :
                      (command == else_command)? had_else : had_endif;
@@ -1316,6 +1323,12 @@ switch (command)
 
   case seen_command:
   case unseen_command:
+  if (*ptr == 0)
+    {
+    *error_pointer = string_sprintf("\"seen\" or \"unseen\" "
+      "near line %d is not followed by a command", line_number);
+    yield = FALSE;
+    }
   if (seen_force)
     {
     *error_pointer = string_sprintf("\"seen\" or \"unseen\" repeated "
@@ -1331,6 +1344,12 @@ switch (command)
   /* So does noerror */
 
   case noerror_command:
+  if (*ptr == 0)
+    {
+    *error_pointer = string_sprintf("\"noerror\" "
+      "near line %d is not followed by a command", line_number);
+    yield = FALSE;
+    }
   noerror_force = TRUE;
   was_noerror = TRUE;
   break;
diff --git a/test/aux-fixed/0037.f-8 b/test/aux-fixed/0037.f-8
new file mode 100644 (file)
index 0000000..2807c12
--- /dev/null
@@ -0,0 +1,5 @@
+#exim filter
+
+if one is one then seen endif
+
+if two is two then save /dev/null endif
diff --git a/test/aux-fixed/0037.f-9 b/test/aux-fixed/0037.f-9
new file mode 100644 (file)
index 0000000..5d8e0ca
--- /dev/null
@@ -0,0 +1,3 @@
+#exim filter
+
+unseen
index 5737c72..a1af00d 100644 (file)
@@ -177,4 +177,12 @@ exim -bt prepend@test.ex
 # Check not prepend $home
 exim -DFILTER_PREPEND_HOME=no_filter_prepend_home -bt prepend@test.ex
 ****
+# Check error for (un)seen and no command
+1
+exim -bf DIR/aux-fixed/TESTNUM.f-8 </dev/null
+****
+# Check error for (un)seen at eof
+1
+exim -bf DIR/aux-fixed/TESTNUM.f-9 </dev/null
+****
 no_msglog_check
index 47139ff..9087a89 100644 (file)
@@ -261,3 +261,17 @@ prepend@test.ex -> /usr/relative
   transport = appendfile
 prepend@test.ex -> relative
   transport = appendfile
+Warning: no message headers read
+Return-path copied from sender
+Sender      = CALLER@test.ex
+Recipient   = CALLER@test.ex
+Testing Exim filter file "TESTSUITE/aux-fixed/0037.f-8"
+
+Filter error: "seen", "unseen", or "noerror" near line 5 is not followed by a command
+Warning: no message headers read
+Return-path copied from sender
+Sender      = CALLER@test.ex
+Recipient   = CALLER@test.ex
+Testing Exim filter file "TESTSUITE/aux-fixed/0037.f-9"
+
+Filter error: "seen" or "unseen" near line 4 is not followed by a command