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, * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA. * 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 #ifdef _MSC_VER
#include <winsock.h> /* only needed in CL_EXPERIMENTAL */ #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 *parseEmailFile(FILE *fin, const table_t *rfc821Table, const char *firstLine, const char *dir);
static message *parseEmailHeaders(message *m, const table_t *rfc821Table); static message *parseEmailHeaders(message *m, const table_t *rfc821Table);
static int parseEmailHeader(message *m, const char *line, 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 boundaryStart(const char *line, const char *boundary);
static int endOfMessage(const char *line, const char *boundary); static int endOfMessage(const char *line, const char *boundary);
static int initialiseTables(table_t **rfc821Table, table_t **subtypeTable); 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 isBounceStart(const char *line);
static bool exportBinhexMessage(const char *dir, message *m); static bool exportBinhexMessage(const char *dir, message *m);
static int exportBounceMessage(text *start, const mbox_ctx *ctx); 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 int count_quotes(const char *buf);
static bool next_is_folded_header(const text *t); 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); messageSetCTX(body, ctx);
messageDestroy(m); messageDestroy(m);
if(messageGetBody(body)) { if(messageGetBody(body)) {
int rc = parseEmailBody(body, NULL, &mctx); int rc = parseEmailBody(body, NULL, &mctx, 0);
if(rc == 0) { if(rc == 0) {
messageReset(body); messageReset(body);
m = body; m = body;
@ -1485,7 +1485,7 @@ cli_parse_mbox(const char *dir, int desc, cli_ctx *ctx)
*/ */
if((retcode == CL_SUCCESS) && messageGetBody(body)) { if((retcode == CL_SUCCESS) && messageGetBody(body)) {
messageSetCTX(body, ctx); messageSetCTX(body, ctx);
switch(parseEmailBody(body, NULL, &mctx)) { switch(parseEmailBody(body, NULL, &mctx, 0)) {
case 0: case 0:
retcode = CL_EFORMAT; retcode = CL_EFORMAT;
break; break;
@ -2019,7 +2019,7 @@ parseEmailHeader(message *m, const char *line, const table_t *rfc821)
* 3 for virus found * 3 for virus found
*/ */
static int /* success or fail */ 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; int rc = 1;
text *aText = textIn; text *aText = textIn;
@ -2032,6 +2032,19 @@ parseEmailBody(message *messageIn, text *textIn, mbox_ctx *mctx)
cli_dbgmsg("in parseEmailBody\n"); 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? */ /* Anything left to be parsed? */
if(mainMessage && (messageGetBody(mainMessage) != NULL)) { if(mainMessage && (messageGetBody(mainMessage) != NULL)) {
mime_type mimeType; mime_type mimeType;
@ -2479,7 +2492,7 @@ parseEmailBody(message *messageIn, text *textIn, mbox_ctx *mctx)
mainMessage = do_multipart(mainMessage, mainMessage = do_multipart(mainMessage,
messages, multiparts, messages, multiparts,
&rc, mctx, messageIn, &rc, mctx, messageIn,
&aText); &aText, recursion_level + 1);
--multiparts; --multiparts;
if(rc == 3) if(rc == 3)
infected = TRUE; infected = TRUE;
@ -2575,7 +2588,7 @@ parseEmailBody(message *messageIn, text *textIn, mbox_ctx *mctx)
if(htmltextPart == -1) if(htmltextPart == -1)
cli_dbgmsg("No HTML code found to be scanned\n"); cli_dbgmsg("No HTML code found to be scanned\n");
else { else {
rc = parseEmailBody(aMessage, aText, mctx); rc = parseEmailBody(aMessage, aText, mctx, recursion_level + 1);
if(rc == 1) { if(rc == 1) {
assert(aMessage == messages[htmltextPart]); assert(aMessage == messages[htmltextPart]);
messageDestroy(aMessage); messageDestroy(aMessage);
@ -2656,14 +2669,14 @@ parseEmailBody(message *messageIn, text *textIn, mbox_ctx *mctx)
for(i = 0; i < multiparts; i++) { for(i = 0; i < multiparts; i++) {
mainMessage = do_multipart(mainMessage, mainMessage = do_multipart(mainMessage,
messages, i, &rc, mctx, messages, i, &rc, mctx,
messageIn, &aText); messageIn, &aText, recursion_level + 1);
if(rc == 3) { if(rc == 3) {
infected = TRUE; infected = TRUE;
break; break;
} }
} }
/* rc = parseEmailBody(NULL, NULL, mctx); */ /* rc = parseEmailBody(NULL, NULL, mctx, recursion_level + 1); */
break; break;
case SIGNED: case SIGNED:
case PARALLEL: case PARALLEL:
@ -2679,7 +2692,7 @@ parseEmailBody(message *messageIn, text *textIn, mbox_ctx *mctx)
if(htmltextPart == -1) if(htmltextPart == -1)
htmltextPart = 0; htmltextPart = 0;
rc = parseEmailBody(messages[htmltextPart], aText, mctx); rc = parseEmailBody(messages[htmltextPart], aText, mctx, recursion_level + 1);
break; break;
case ENCRYPTED: case ENCRYPTED:
rc = 0; rc = 0;
@ -2753,7 +2766,7 @@ parseEmailBody(message *messageIn, text *textIn, mbox_ctx *mctx)
} else } else
messageReset(mainMessage); messageReset(mainMessage);
if(messageGetBody(m)) if(messageGetBody(m))
rc = parseEmailBody(m, NULL, mctx); rc = parseEmailBody(m, NULL, mctx, recursion_level + 1);
messageDestroy(m); 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 * Handle the ith element of a number of multiparts, e.g. multipart/alternative
*/ */
static message * 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; bool addToText = FALSE;
const char *dtype; const char *dtype;
@ -5303,7 +5316,7 @@ do_multipart(message *mainMessage, message **messages, int i, int *rc, mbox_ctx
messages[i] = NULL; messages[i] = NULL;
if(body) { if(body) {
messageSetCTX(body, ctx); messageSetCTX(body, ctx);
rc = parseEmailBody(body, NULL, mctx); rc = parseEmailBody(body, NULL, mctx, recursion_level + 1);
if(messageContainsVirus(body)) if(messageContainsVirus(body))
*rc = 3; *rc = 3;
messageDestroy(body); 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 * The headers were parsed when reading in the
* whole multipart section * whole multipart section
*/ */
*rc = parseEmailBody(aMessage, *tptr, mctx); *rc = parseEmailBody(aMessage, *tptr, mctx, recursion_level + 1);
cli_dbgmsg("Finished recursion\n"); cli_dbgmsg("Finished recursion\n");
assert(aMessage == messages[i]); assert(aMessage == messages[i]);
messageDestroy(messages[i]); messageDestroy(messages[i]);
messages[i] = NULL; messages[i] = NULL;
} else { } else {
*rc = parseEmailBody(NULL, NULL, mctx); *rc = parseEmailBody(NULL, NULL, mctx, recursion_level + 1);
if(mainMessage && (mainMessage != messageIn)) if(mainMessage && (mainMessage != messageIn))
messageDestroy(mainMessage); messageDestroy(mainMessage);
mainMessage = NULL; mainMessage = NULL;

Loading…
Cancel
Save