Mercurial > dovecot > core-2.2
changeset 21174:e48aa279058a
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)
author | Timo Sirainen <timo.sirainen@dovecot.fi> |
---|---|
date | Fri, 18 Nov 2016 16:03:00 +0200 |
parents | 369e2eec8992 |
children | 6a062a3335e8 |
files | src/imap/imap-state.c |
diffstat | 1 files changed, 13 insertions(+), 7 deletions(-) [+] |
line wrap: on
line diff
--- a/src/imap/imap-state.c Fri Nov 18 16:58:00 2016 +0200 +++ b/src/imap/imap-state.c Fri Nov 18 16:03:00 2016 +0200 @@ -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 @@ 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 @@ 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 @@ 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 */