Преглед на файлове

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).
Linus Groh преди 4 години
родител
ревизия
66e47d05c5
променени са 1 файла, в които са добавени 7 реда и са изтрити 2 реда
  1. 7 2
      Userland/Libraries/LibIMAP/Parser.cpp

+ 7 - 2
Userland/Libraries/LibIMAP/Parser.cpp

@@ -164,17 +164,22 @@ void Parser::parse_untagged()
         consume(" ");
         consume(" ");
         if (try_consume("[")) {
         if (try_consume("[")) {
             auto actual_type = parse_atom();
             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();
                 auto n = parse_number();
                 m_response.data().set_uid_next(n);
                 m_response.data().set_uid_next(n);
             } else if (actual_type == "UIDVALIDITY"sv) {
             } else if (actual_type == "UIDVALIDITY"sv) {
+                consume(" ");
                 auto n = parse_number();
                 auto n = parse_number();
                 m_response.data().set_uid_validity(n);
                 m_response.data().set_uid_validity(n);
             } else if (actual_type == "UNSEEN"sv) {
             } else if (actual_type == "UNSEEN"sv) {
+                consume(" ");
                 auto n = parse_number();
                 auto n = parse_number();
                 m_response.data().set_unseen(n);
                 m_response.data().set_unseen(n);
             } else if (actual_type == "PERMANENTFLAGS"sv) {
             } else if (actual_type == "PERMANENTFLAGS"sv) {
+                consume(" ");
                 auto flags = parse_list(+[](StringView x) { return String(x); });
                 auto flags = parse_list(+[](StringView x) { return String(x); });
                 m_response.data().set_permanent_flags(move(flags));
                 m_response.data().set_permanent_flags(move(flags));
             } else {
             } else {