Honour MaxArchiveLevel

git-svn: trunk@2452
remotes/push_mirror/metadata
Nigel Horne 19 years ago
parent 53725d8cf9
commit 242ffd7a4d
  1. 45
      clamav-devel/libclamav/mbox.c

@ -16,7 +16,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA.
*/
static char const rcsid[] = "$Id: mbox.c,v 1.356 2006/10/16 00:33:34 tkojm Exp $";
static char const rcsid[] = "$Id: mbox.c,v 1.357 2006/10/29 13:54:06 njh Exp $";
#ifdef _MSC_VER
#include <winsock.h> /* only needed in CL_EXPERIMENTAL */
@ -269,7 +269,7 @@ static int cli_parse_mbox(const char *dir, int desc, cli_ctx *ctx);
static message *parseEmailFile(FILE *fin, const table_t *rfc821Table, const char *firstLine, const char *dir);
static message *parseEmailHeaders(message *m, const table_t *rfc821Table);
static int parseEmailHeader(message *m, const char *line, const table_t *rfc821Table);
static int parseEmailBody(message *messageIn, text *textIn, mbox_ctx *mctx);
static int parseEmailBody(message *messageIn, text *textIn, mbox_ctx *mctx, unsigned int recursion_level);
static int boundaryStart(const char *line, const char *boundary);
static int endOfMessage(const char *line, const char *boundary);
static int initialiseTables(table_t **rfc821Table, table_t **subtypeTable);
@ -287,7 +287,7 @@ static char *getline_from_mbox(char *buffer, size_t len, FILE *fin);
static bool isBounceStart(const char *line);
static bool exportBinhexMessage(const char *dir, message *m);
static int exportBounceMessage(text *start, const mbox_ctx *ctx);
static message *do_multipart(message *mainMessage, message **messages, int i, int *rc, mbox_ctx *mctx, message *messageIn, text **tptr);
static message *do_multipart(message *mainMessage, message **messages, int i, int *rc, mbox_ctx *mctx, message *messageIn, text **tptr, unsigned int recursion_level);
static int count_quotes(const char *buf);
static bool next_is_folded_header(const text *t);
@ -1404,7 +1404,7 @@ cli_parse_mbox(const char *dir, int desc, cli_ctx *ctx)
messageSetCTX(body, ctx);
messageDestroy(m);
if(messageGetBody(body)) {
int rc = parseEmailBody(body, NULL, &mctx);
int rc = parseEmailBody(body, NULL, &mctx, 0);
if(rc == 0) {
messageReset(body);
m = body;
@ -1485,7 +1485,7 @@ cli_parse_mbox(const char *dir, int desc, cli_ctx *ctx)
*/
if((retcode == CL_SUCCESS) && messageGetBody(body)) {
messageSetCTX(body, ctx);
switch(parseEmailBody(body, NULL, &mctx)) {
switch(parseEmailBody(body, NULL, &mctx, 0)) {
case 0:
retcode = CL_EFORMAT;
break;
@ -2019,7 +2019,7 @@ parseEmailHeader(message *m, const char *line, const table_t *rfc821)
* 3 for virus found
*/
static int /* success or fail */
parseEmailBody(message *messageIn, text *textIn, mbox_ctx *mctx)
parseEmailBody(message *messageIn, text *textIn, mbox_ctx *mctx, unsigned int recursion_level)
{
int rc = 1;
text *aText = textIn;
@ -2032,6 +2032,19 @@ parseEmailBody(message *messageIn, text *textIn, mbox_ctx *mctx)
cli_dbgmsg("in parseEmailBody\n");
/*
* FIXME: Using ArchiveMaxRecursion is not good since that is
* typically rather low (default = 8) and it would be better for
* this code to use a higher limit. Needs support in the cl_limits
* structure
*/
if(mctx->ctx->limits->maxreclevel)
if(recursion_level >= mctx->ctx->limits->maxreclevel) {
cli_warnmsg("parseEmailBody: hit maximum recursion level (%u)\n",
mctx->ctx->limits->maxreclevel);
return 2;
}
/* Anything left to be parsed? */
if(mainMessage && (messageGetBody(mainMessage) != NULL)) {
mime_type mimeType;
@ -2479,7 +2492,7 @@ parseEmailBody(message *messageIn, text *textIn, mbox_ctx *mctx)
mainMessage = do_multipart(mainMessage,
messages, multiparts,
&rc, mctx, messageIn,
&aText);
&aText, recursion_level + 1);
--multiparts;
if(rc == 3)
infected = TRUE;
@ -2575,7 +2588,7 @@ parseEmailBody(message *messageIn, text *textIn, mbox_ctx *mctx)
if(htmltextPart == -1)
cli_dbgmsg("No HTML code found to be scanned\n");
else {
rc = parseEmailBody(aMessage, aText, mctx);
rc = parseEmailBody(aMessage, aText, mctx, recursion_level + 1);
if(rc == 1) {
assert(aMessage == messages[htmltextPart]);
messageDestroy(aMessage);
@ -2656,14 +2669,14 @@ parseEmailBody(message *messageIn, text *textIn, mbox_ctx *mctx)
for(i = 0; i < multiparts; i++) {
mainMessage = do_multipart(mainMessage,
messages, i, &rc, mctx,
messageIn, &aText);
messageIn, &aText, recursion_level + 1);
if(rc == 3) {
infected = TRUE;
break;
}
}
/* rc = parseEmailBody(NULL, NULL, mctx); */
/* rc = parseEmailBody(NULL, NULL, mctx, recursion_level + 1); */
break;
case SIGNED:
case PARALLEL:
@ -2679,7 +2692,7 @@ parseEmailBody(message *messageIn, text *textIn, mbox_ctx *mctx)
if(htmltextPart == -1)
htmltextPart = 0;
rc = parseEmailBody(messages[htmltextPart], aText, mctx);
rc = parseEmailBody(messages[htmltextPart], aText, mctx, recursion_level + 1);
break;
case ENCRYPTED:
rc = 0;
@ -2753,7 +2766,7 @@ parseEmailBody(message *messageIn, text *textIn, mbox_ctx *mctx)
} else
messageReset(mainMessage);
if(messageGetBody(m))
rc = parseEmailBody(m, NULL, mctx);
rc = parseEmailBody(m, NULL, mctx, recursion_level + 1);
messageDestroy(m);
}
@ -5138,7 +5151,7 @@ exportBounceMessage(text *start, const mbox_ctx *mctx)
* Handle the ith element of a number of multiparts, e.g. multipart/alternative
*/
static message *
do_multipart(message *mainMessage, message **messages, int i, int *rc, mbox_ctx *mctx, message *messageIn, text **tptr)
do_multipart(message *mainMessage, message **messages, int i, int *rc, mbox_ctx *mctx, message *messageIn, text **tptr, unsigned int recursion_level)
{
bool addToText = FALSE;
const char *dtype;
@ -5303,7 +5316,7 @@ do_multipart(message *mainMessage, message **messages, int i, int *rc, mbox_ctx
messages[i] = NULL;
if(body) {
messageSetCTX(body, ctx);
rc = parseEmailBody(body, NULL, mctx);
rc = parseEmailBody(body, NULL, mctx, recursion_level + 1);
if(messageContainsVirus(body))
*rc = 3;
messageDestroy(body);
@ -5322,13 +5335,13 @@ do_multipart(message *mainMessage, message **messages, int i, int *rc, mbox_ctx
* The headers were parsed when reading in the
* whole multipart section
*/
*rc = parseEmailBody(aMessage, *tptr, mctx);
*rc = parseEmailBody(aMessage, *tptr, mctx, recursion_level + 1);
cli_dbgmsg("Finished recursion\n");
assert(aMessage == messages[i]);
messageDestroy(messages[i]);
messages[i] = NULL;
} else {
*rc = parseEmailBody(NULL, NULL, mctx);
*rc = parseEmailBody(NULL, NULL, mctx, recursion_level + 1);
if(mainMessage && (mainMessage != messageIn))
messageDestroy(mainMessage);
mainMessage = NULL;

Loading…
Cancel
Save