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 */