]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
maildir: Fixed updating filenames in existing uidlist
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Wed, 29 Jun 2016 15:31:21 +0000 (18:31 +0300)
committerTimo Sirainen <timo.sirainen@dovecot.fi>
Wed, 29 Jun 2016 15:31:21 +0000 (18:31 +0300)
Broken by 042668c0c.

This could have caused errors like:

 - maildir_file_do(...): Filename keeps changing
 - Expunged message reappeared, giving a new UID

src/lib-storage/index/maildir/maildir-uidlist.c

index e29b925670517ab4d05f00c694def8d152b47cc6..99db5c79af77c8ff9184a37730e83dc310167acd 100644 (file)
@@ -1706,6 +1706,8 @@ maildir_uidlist_sync_next_partial(struct maildir_uidlist_sync_ctx *ctx,
                uidlist->change_counter++;
 
                hash_table_insert(uidlist->files, rec->filename, rec);
+       } else if (strcmp(rec->filename, filename) != 0) {
+               rec->filename = p_strdup(uidlist->record_pool, filename);
        }
        if (uid != 0) {
                if (rec->uid != uid && rec->uid != (uint32_t)-1) {
@@ -1800,6 +1802,8 @@ int maildir_uidlist_sync_next_uid(struct maildir_uidlist_sync_ctx *ctx,
                   to check for duplicates. */
                rec->flags &= ~(MAILDIR_UIDLIST_REC_FLAG_NEW_DIR |
                                MAILDIR_UIDLIST_REC_FLAG_MOVED);
+               if (strcmp(rec->filename, filename) != 0)
+                       rec->filename = p_strdup(ctx->record_pool, filename);
        } else {
                old_rec = hash_table_lookup(uidlist->files, filename);
                i_assert(old_rec != NULL || UIDLIST_IS_LOCKED(uidlist));