Mercurial > dovecot > core-2.2
changeset 10739:9fdeca77d421 HEAD
maildir: Make sure we message's UID isn't tried to be changed unexpectedly.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Thu, 18 Feb 2010 05:53:08 +0200 |
parents | 843a9d68f2f5 |
children | 386b13dfee04 |
files | src/lib-storage/index/maildir/maildir-uidlist.c |
diffstat | 1 files changed, 11 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-storage/index/maildir/maildir-uidlist.c Thu Feb 18 05:26:51 2010 +0200 +++ b/src/lib-storage/index/maildir/maildir-uidlist.c Thu Feb 18 05:53:08 2010 +0200 @@ -1644,7 +1644,7 @@ return 1; } -static void +static int maildir_uidlist_sync_next_partial(struct maildir_uidlist_sync_ctx *ctx, const char *filename, uint32_t uid, enum maildir_uidlist_rec_flag flags) @@ -1658,7 +1658,7 @@ /* doesn't exist in uidlist */ if (!ctx->locked) { /* we can't add it, so just ignore it */ - return; + return 1; } if (ctx->first_new_pos == (unsigned int)-1) ctx->first_new_pos = array_count(&uidlist->records); @@ -1679,6 +1679,12 @@ uidlist->change_counter++; } if (uid != 0) { + if (rec->uid != uid && rec->uid != (uint32_t)-1) { + mail_storage_set_critical(uidlist->mbox->box.storage, + "Maildir: %s changed UID %u -> %u", + filename, rec->uid, uid); + return -1; + } rec->uid = uid; if (uidlist->next_uid <= uid) uidlist->next_uid = uid + 1; @@ -1689,6 +1695,7 @@ hash_table_insert(uidlist->files, rec->filename, rec); ctx->finished = FALSE; + return 1; } static unsigned char *ext_dup(pool_t pool, const unsigned char *extensions) @@ -1740,8 +1747,8 @@ } if (ctx->partial) { - maildir_uidlist_sync_next_partial(ctx, filename, uid, flags); - return 1; + return maildir_uidlist_sync_next_partial(ctx, filename, + uid, flags); } rec = hash_table_lookup(ctx->files, filename);