]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
smtp: skip preprocessing for mime headers
authorVictor Julien <vjulien@oisf.net>
Sat, 25 Jun 2022 11:01:37 +0000 (13:01 +0200)
committerVictor Julien <vjulien@oisf.net>
Wed, 29 Jun 2022 17:55:00 +0000 (19:55 +0200)
Mime parser doesn't expect partial lines, which preprocessing can
provide. Add a check to let mime headers be handled by regular line
parsing.

(cherry picked from commit a38f2f2a52822f150fff0d5e17e9f62582d6558c)

src/app-layer-smtp.c
src/util-decode-mime.c

index da83df2eae1b2b900503b7091c51123c776e37ec..adf4d1240eff4ccf08577479ba95b1b85c72cdb2 100644 (file)
@@ -1200,6 +1200,11 @@ static int SMTPPreProcessCommands(SMTPState *state, Flow *f, AppLayerParserState
 {
     DEBUG_VALIDATE_BUG_ON((state->parser_state & SMTP_PARSER_STATE_COMMAND_DATA_MODE) == 0);
 
+    /* fall back to strict line parsing for mime header parsing */
+    if (state->curr_tx && state->curr_tx->mime_state &&
+            state->curr_tx->mime_state->state_flag < HEADER_DONE)
+        return 1;
+
     bool line_complete = false;
     int32_t input_len = state->input_len;
     for (int32_t i = 0; i < input_len; i++) {
index 29a3169916862ac88466c885802fdf6198a40234..66c1ee21f01af8191a7fd08fffc111216883af3c 100644 (file)
@@ -1693,6 +1693,9 @@ static int FindMimeHeader(const uint8_t *buf, uint32_t blen,
     int finish_header = 0, new_header = 0;
     MimeDecConfig *mdcfg = MimeDecGetConfig();
 
+    /* should not get here with incomplete lines */
+    DEBUG_VALIDATE_BUG_ON(state->current_line_delimiter_len == 0);
+
     /* Find first header */
     hname = FindMimeHeaderStart(buf, blen, &hlen);
     if (hname != NULL) {