From: Timo Sirainen Date: Fri, 18 Nov 2016 14:03:00 +0000 (+0200) Subject: imap: Fix recent flags importing when un-hibernating X-Git-Tag: 2.2.27~94 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=13fd9a5374adefe5e73431ae9ec4d11f99ad40f1;p=thirdparty%2Fdovecot%2Fcore.git imap: Fix recent flags importing when un-hibernating The initial RECENT counter that was sent didn't include pre-hibernation \Recent flags. \Recent flags were also added for mails that were already expunged, which could have caused recent counter to be wrong later on, and possibly assert-crash with: Panic: file index-status.c: line 130 (index_storage_get_open_status): assertion failed: (status_r->recent <= status_r->messages) --- diff --git a/src/imap/imap-state.c b/src/imap/imap-state.c index a0c79f4b12..81a16785c2 100644 --- a/src/imap/imap-state.c +++ b/src/imap/imap-state.c @@ -9,7 +9,7 @@ #include "str-sanitize.h" #include "imap-util.h" #include "mail-search-build.h" -#include "mail-storage.h" +#include "mail-storage-private.h" #include "mailbox-recent-flags.h" #include "imap-client.h" #include "imap-fetch.h" @@ -627,7 +627,6 @@ import_state_mailbox_open(struct client *client, client->mailbox = box; client->mailbox_examined = state->examined; client->messages_count = status.messages; - client->recent_count = status.recent; client->uidvalidity = status.uidvalidity; client->notify_uidnext = status.uidnext; @@ -640,6 +639,18 @@ import_state_mailbox_open(struct client *client, state->messages - expunge_count); return -1; } + + client_update_mailbox_flags(client, status.keywords); + array_foreach(&state->recent_uids, range) { + for (uid = range->seq1; uid <= range->seq2; uid++) { + uint32_t seq; + + if (mail_index_lookup_seq(box->view, uid, &seq)) + mailbox_recent_flags_set_uid_forced(box, uid); + } + } + client->recent_count = mailbox_recent_flags_count(box); + if (state->messages - expunge_count < client->messages_count) { /* new messages arrived */ client_send_line(client, @@ -648,11 +659,6 @@ import_state_mailbox_open(struct client *client, t_strdup_printf("* %u RECENT", client->recent_count)); } - client_update_mailbox_flags(client, status.keywords); - array_foreach(&state->recent_uids, range) { - for (uid = range->seq1; uid <= range->seq2; uid++) - mailbox_recent_flags_set_uid_forced(box, uid); - } if (array_count(status.keywords) == state->keywords_count && mailbox_status_keywords_crc32(&status) == state->keywords_crc32) { /* no changes to keywords */