]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
smtp: return on line completion
authorShivani Bhardwaj <shivani@oisf.net>
Tue, 25 Apr 2023 07:12:16 +0000 (12:42 +0530)
committerVictor Julien <vjulien@oisf.net>
Fri, 5 May 2023 08:22:11 +0000 (10:22 +0200)
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

index c4f1d96edd553928df22558010847e623f17e7e7..d48c23bf11f0a3bc877cef65b7acb04ab775ead9 100644 (file)
@@ -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)