From c0067a5fffeb8b014b6756a572afe437d2bb561d Mon Sep 17 00:00:00 2001 From: Shivani Bhardwaj Date: Tue, 25 Apr 2023 12:42:16 +0530 Subject: [PATCH] smtp: return on line completion Problem: If we receive a long line w/o LF, we cap it to 4k bytes and wait until a line with LF comes in order to consider the previous line complete. Any data post the 4k bytes is discarded. Currently, if a line with LF comes in after a long line, we reset all the parameters used for processing it like the line.len and line.delim_len but we still make the call to SMTPProcessRequest fn without even the need to process anything. Since such a line (with len and delim_len set to 0) should not reach mime decoder, a debug assertion triggers there in this case. Fix: Make sure to return early as the line has to be skipped and not processed at all. Bug 6019 --- src/app-layer-smtp.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/app-layer-smtp.c b/src/app-layer-smtp.c index c4f1d96edd..d48c23bf11 100644 --- a/src/app-layer-smtp.c +++ b/src/app-layer-smtp.c @@ -1139,6 +1139,13 @@ static int SMTPProcessRequest(SMTPState *state, Flow *f, AppLayerParserState *ps SCEnter(); SMTPTransaction *tx = state->curr_tx; + /* If current input is to be discarded because it completes a long line, + * line's length and delimeter len are reset to 0. Skip processing this line. + * This line is only to get us out of the state where we should discard any + * data till LF. */ + if (line->len == 0 && line->delim_len == 0) { + return 0; + } if (state->curr_tx == NULL || (state->curr_tx->done && !NoNewTx(state, line))) { tx = SMTPTransactionCreate(); if (tx == NULL)