-/* $Cambridge: exim/src/src/filtertest.c,v 1.4 2005/02/17 11:58:26 ph10 Exp $ */
-
/*************************************************
* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) University of Cambridge 1995 - 2005 */
+/* Copyright (c) The Exim Maintainers 2021 - 2022 */
+/* Copyright (c) University of Cambridge 1995 - 2009 */
/* See the file NOTICE for conditions of use and distribution. */
+/* SPDX-License-Identifier: GPL-2.0-or-later */
/* Code for the filter test function. */
we can set up the message_body variables at the same time (in normal use, the
message_body variables are not set up unless needed). The reading code is
written out here rather than having options in read_message_data, in order to
-keep that function as efficient as possible. Handling message_body_end is
-somewhat more tedious. Pile it all into a circular buffer and sort out at the
-end.
+keep that function as efficient as possible. (Later: this function is now
+global because it is also used by the -bem testing option.) Handling
+message_body_end is somewhat more tedious. Pile it all into a circular buffer
+and sort out at the end.
Arguments:
dot_ended TRUE if message already terminated by '.'
Returns: nothing
*/
-static void
-read_message_body(dot_ended)
+void
+read_message_body(BOOL dot_ended)
{
register int ch;
int body_len, body_end_len, header_size;
body_linecount = 0;
header_size = message_size;
-if (!dot_ended && !feof(stdin))
+if (!dot_ended && !stdin_feof())
{
- if (!dot_ends)
+ if (!f.dot_ends)
{
- while ((ch = getc(stdin)) != EOF)
+ while ((ch = stdin_getc(GETC_BUFFER_UNLIMITED)) != EOF)
{
if (ch == 0) body_zerocount++;
if (ch == '\n') body_linecount++;
else
{
int ch_state = 1;
- while ((ch = getc(stdin)) != EOF)
+ while ((ch = stdin_getc(GETC_BUFFER_UNLIMITED)) != EOF)
{
if (ch == 0) body_zerocount++;
switch (ch_state)
if (s > message_body_end + message_body_visible) s = message_body_end;
message_size++;
}
- READ_END: ch = ch; /* Some compilers don't like null statements */
+ READ_END: ;
}
if (s == message_body_end || s[-1] != '\n') body_linecount++;
}
+debug_printf("%s %d\n", __FUNCTION__, __LINE__);
message_body[body_len] = 0;
message_body_size = message_size - header_size;
int above = message_body_visible - below;
if (above > 0)
{
- uschar *temp = store_get(below);
+ uschar * temp = store_get(below, GET_UNTAINTED);
memcpy(temp, message_body_end, below);
memmove(message_body_end, s+1, above);
memcpy(message_body_end + above, temp, below);
*/
BOOL
-filter_runtest(int fd, uschar *filename, BOOL is_system, BOOL dot_ended)
+filter_runtest(int fd, const uschar * filename, BOOL is_system, BOOL dot_ended)
{
int rc, filter_type;
BOOL yield;
return FALSE;
}
-filebuf = store_get(statbuf.st_size + 1);
+filebuf = store_get(statbuf.st_size + 1, filename);
rc = read(fd, filebuf, statbuf.st_size);
-close(fd);
+(void)close(fd);
if (rc != statbuf.st_size)
{
/* For a filter, set up the message_body variables and the message size if this
is the first time this function has been called. */
-if (message_body == NULL) read_message_body(dot_ended);
+if (!message_body) read_message_body(dot_ended);
/* Now pass the filter file to the function that interprets it. Because
filter_test is not FILTER_NONE, the interpreter will output comments about what
if (is_system)
{
- system_filtering = TRUE;
- enable_dollar_recipients = TRUE; /* Permit $recipients in system filter */
+ f.system_filtering = TRUE;
+ f.enable_dollar_recipients = TRUE; /* Permit $recipients in system filter */
yield = filter_interpret
(filebuf,
RDO_DEFER|RDO_FAIL|RDO_FILTER|RDO_FREEZE|RDO_REWRITE, &generated, &error);
- enable_dollar_recipients = FALSE;
- system_filtering = FALSE;
+ f.enable_dollar_recipients = FALSE;
+ f.system_filtering = FALSE;
}
else
{
- yield = (filter_type == FILTER_SIEVE)?
- sieve_interpret(filebuf, RDO_REWRITE, NULL, &generated, &error)
- :
- filter_interpret(filebuf, RDO_REWRITE, &generated, &error);
+ yield = filter_type == FILTER_SIEVE
+ ? sieve_interpret(filebuf, RDO_REWRITE, NULL, NULL, NULL, NULL, &generated, &error)
+ : filter_interpret(filebuf, RDO_REWRITE, &generated, &error);
}
return yield != FF_ERROR;