From e9cf35fd6060ab14d8c2d25cf0890a19f6d75199 Mon Sep 17 00:00:00 2001 From: Karol Kosek Date: Sat, 2 Sep 2023 20:39:37 +0200 Subject: [PATCH] LibIMAP: Parse body-ext-1part for every one part body type Previously we were only doing it only for body-type-text, which isn't correct to spec. Fixes a crash when parsing a BODYSTRUCTURE response on a mail with attachments. --- Userland/Libraries/LibIMAP/Parser.cpp | 71 ++++++++++++++------------- 1 file changed, 36 insertions(+), 35 deletions(-) diff --git a/Userland/Libraries/LibIMAP/Parser.cpp b/Userland/Libraries/LibIMAP/Parser.cpp index fcf61ef3b3..734f230aaf 100644 --- a/Userland/Libraries/LibIMAP/Parser.cpp +++ b/Userland/Libraries/LibIMAP/Parser.cpp @@ -452,41 +452,6 @@ BodyStructure Parser::parse_one_part_body() // NOTE: "media-text SP body-fields" part is already parsed. consume(" "sv); data.lines = MUST(parse_number()); - - if (!try_consume(")"sv)) { - consume(" "sv); - auto md5 = parse_nstring(); - if (md5.has_value()) - data.md5 = { md5.value() }; - if (!try_consume(")"sv)) { - consume(" "sv); - if (!try_consume("NIL"sv)) { - auto disposition = parse_disposition(); - data.disposition = { disposition }; - } - - if (!try_consume(")"sv)) { - consume(" "sv); - if (!try_consume("NIL"sv)) { - data.langs = { parse_langs() }; - } - - if (!try_consume(")"sv)) { - consume(" "sv); - auto location = parse_nstring(); - if (location.has_value()) - data.location = { location.value() }; - - Vector extensions; - while (!try_consume(")"sv)) { - extensions.append(parse_body_extension()); - try_consume(" "sv); - } - data.extensions = { move(extensions) }; - } - } - } - } } else if (data.type.equals_ignoring_ascii_case("MESSAGE"sv) && data.subtype.equals_ignoring_ascii_case("RFC822"sv)) { // body-type-msg // NOTE: "media-message SP body-fields" part is already parsed. @@ -497,6 +462,42 @@ BodyStructure Parser::parse_one_part_body() // NOTE: "media-basic SP body-fields" is already parsed. } + if (!try_consume(")"sv)) { + consume(" "sv); + + // body-ext-1part + [&]() { + data.md5 = Optional(parse_nstring()); + + if (try_consume(")"sv)) + return; + consume(" "sv); + if (!try_consume("NIL"sv)) { + auto disposition = parse_disposition(); + data.disposition = { disposition }; + } + + if (try_consume(")"sv)) + return; + consume(" "sv); + if (!try_consume("NIL"sv)) { + data.langs = { parse_langs() }; + } + + if (try_consume(")"sv)) + return; + consume(" "sv); + data.location = Optional(parse_nstring()); + + Vector extensions; + while (!try_consume(")"sv)) { + extensions.append(parse_body_extension()); + try_consume(" "sv); + } + data.extensions = { move(extensions) }; + }(); + } + return BodyStructure(move(data)); } Vector Parser::parse_langs()