From: Vsevolod Stakhov Date: Wed, 20 Mar 2024 17:16:48 +0000 (+0000) Subject: [Fix] Fix inconsistent nesting in mime parts X-Git-Tag: 3.9.0~87^2 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=refs%2Fpull%2F4882%2Fhead;p=thirdparty%2Frspamd.git [Fix] Fix inconsistent nesting in mime parts We should do like MUAs do: imlicitly close incomplete mime parts and treat them as ususal. It is weird and utterly stupid but that's what MUA do. Issue: #4740 Closes: #4740 --- diff --git a/src/libmime/mime_parser.c b/src/libmime/mime_parser.c index e753f6377c..ac35cffe3b 100644 --- a/src/libmime/mime_parser.c +++ b/src/libmime/mime_parser.c @@ -1055,6 +1055,7 @@ rspamd_multipart_boundaries_filter(struct rspamd_task *task, goffset last_offset; unsigned int i, sel = 0; enum rspamd_mime_parse_error ret; + bool enforce_closing = false; last_offset = (multipart->raw_data.begin - st->start) + multipart->raw_data.len; @@ -1099,6 +1100,12 @@ rspamd_multipart_boundaries_filter(struct rspamd_task *task, cur = &g_array_index(st->boundaries, struct rspamd_mime_boundary, i); if (cur->boundary > last_offset) { + /* + * We have reached the end of the part, so we have to close it implicitly + * like MUA do + */ + task->flags |= RSPAMD_TASK_FLAG_BROKEN_HEADERS; + enforce_closing = true; break; } @@ -1136,7 +1143,7 @@ rspamd_multipart_boundaries_filter(struct rspamd_task *task, } } - if (i == st->boundaries->len && cb->cur_boundary) { + if (enforce_closing || (i == st->boundaries->len && cb->cur_boundary)) { /* Process the last part */ struct rspamd_mime_boundary fb;