X-Git-Url: https://git.exim.org/exim.git/blobdiff_plain/82c19f950c446354c9ef100e0f938ec61db25010..0a49a7a4f1090b6f1ce1d0f9d969804c9226b53e:/src/src/filter.c diff --git a/src/src/filter.c b/src/src/filter.c index 1773a8f2f..b1fcd40b0 100644 --- a/src/src/filter.c +++ b/src/src/filter.c @@ -1,10 +1,10 @@ -/* $Cambridge: exim/src/src/filter.c,v 1.7 2005/11/11 10:02:04 ph10 Exp $ */ +/* $Cambridge: exim/src/src/filter.c,v 1.15 2009/11/16 19:50:37 nm4 Exp $ */ /************************************************* * Exim - an Internet mail transport agent * *************************************************/ -/* Copyright (c) University of Cambridge 1995 - 2005 */ +/* Copyright (c) University of Cambridge 1995 - 2009 */ /* See the file NOTICE for conditions of use and distribution. */ @@ -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; @@ -1414,7 +1433,7 @@ Returns: TRUE if the condition is met static BOOL test_condition(condition_block *c, BOOL toplevel) { -BOOL yield; +BOOL yield = FALSE; const pcre *re; uschar *exp[2], *p, *pp; const uschar *regcomp_error = NULL; @@ -1834,11 +1853,12 @@ while (commands != NULL) else { + if (s[0] != '/' && (filter_options & RDO_PREPEND_HOME) != 0 && + deliver_home != NULL && deliver_home[0] != 0) + s = string_sprintf("%s/%s", deliver_home, s); DEBUG(D_filter) debug_printf("Filter: %ssave message to: %s%s\n", (commands->seen)? "" : "unseen ", s, commands->noerror? " (noerror)" : ""); - if (s[0] != '/' && deliver_home != NULL && deliver_home[0] != 0) - s = string_sprintf("%s/%s", deliver_home, s); /* Create the new address and add it to the chain, setting the af_pfr and af_file flags, the af_ignore_error flag if necessary, and the @@ -2166,7 +2186,6 @@ while (commands != NULL) string_printing(s), command_list[commands->command]); return FF_ERROR; } - pp++; } p = pp; } @@ -2211,6 +2230,7 @@ while (commands != NULL) uschar *to = commands->args[mailarg_index_to].u; int size = 0; int ptr = 0; + int badflag = 0; if (to == NULL) to = expand_string(US"$reply_address"); while (isspace(*to)) to++; @@ -2283,11 +2303,15 @@ while (commands != NULL) while (isspace(*tt)) tt++; } - if (log_addr == NULL) log_addr = string_sprintf("invalid-to-line"); - else log_addr[ptr] = 0; + if (log_addr == NULL) + { + log_addr = string_sprintf(">**bad-reply**"); + badflag = af_bad_reply; + } + else log_addr[ptr] = 0; addr = deliver_make_addr(log_addr, FALSE); - setflag(addr, af_pfr); + setflag(addr, (af_pfr|badflag)); if (commands->noerror) setflag(addr, af_ignore_error); addr->next = *generated; *generated = addr;