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)
/* 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);
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;
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)
}
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);