From 66e47d05c5f3d2a0c403017e3c96d70a4988828a Mon Sep 17 00:00:00 2001 From: Linus Groh Date: Sat, 24 Jul 2021 21:08:46 +0100 Subject: [PATCH] LibIMAP: Parse OK [CLOSED] In my case the mail server responded with the following after selecting a mailbox (in the Mail application): * OK [CLOSED] Previous mailbox closed. * FLAGS (\Answered \Flagged ...) * OK [PERMANENTFLAGS (\Answered \Flagged ... \*)] Flags permitted. * 2 EXISTS * 0 RECENT * OK [UIDVALIDITY 1234567890] UIDs valid * OK [UIDNEXT 12345] Predicted next UID * OK [HIGHESTMODSEQ 123456] Highest A6 OK [READ-WRITE] Select completed (0.002 secs). The [CLOSED] part threw the parser off as it was expecting a space after the atom following the opening bracket, which would actually lead to a crash of Mail (AK::Optional::value() without value). --- Userland/Libraries/LibIMAP/Parser.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/Userland/Libraries/LibIMAP/Parser.cpp b/Userland/Libraries/LibIMAP/Parser.cpp index 40782d776b..ac7691a983 100644 --- a/Userland/Libraries/LibIMAP/Parser.cpp +++ b/Userland/Libraries/LibIMAP/Parser.cpp @@ -164,17 +164,22 @@ void Parser::parse_untagged() consume(" "); if (try_consume("[")) { auto actual_type = parse_atom(); - consume(" "); - if (actual_type == "UIDNEXT"sv) { + if (actual_type == "CLOSED"sv) { + // No-op. + } else if (actual_type == "UIDNEXT"sv) { + consume(" "); auto n = parse_number(); m_response.data().set_uid_next(n); } else if (actual_type == "UIDVALIDITY"sv) { + consume(" "); auto n = parse_number(); m_response.data().set_uid_validity(n); } else if (actual_type == "UNSEEN"sv) { + consume(" "); auto n = parse_number(); m_response.data().set_unseen(n); } else if (actual_type == "PERMANENTFLAGS"sv) { + consume(" "); auto flags = parse_list(+[](StringView x) { return String(x); }); m_response.data().set_permanent_flags(move(flags)); } else {