const unsigned char *data;
unsigned char md5_digest[16];
size_t size, pos;
- int ret;
+ int ret, dirty;
/* get the From-line */
pos = 0;
ret = 1;
if (index->header->messages_count == 0 &&
- ctx.uid_validity != index->header->messages_count) {
+ ctx.uid_validity != index->header->uid_validity) {
/* UID validity is different */
if (ctx.uid_validity == 0) {
/* we have to write it to mbox */
/* X-UID header looks ok */
if (ret != 0)
index->header->next_uid = ctx.uid;
+ dirty = ctx.content_length_broken && !index->mailbox_readonly;
} else if (!index->mailbox_readonly) {
/* Write X-UID for it */
+ dirty = TRUE;
+ } else {
+ /* save MD5 */
+ md5_final(&ctx.md5, md5_digest);
+ index->update_field_raw(update, DATA_FIELD_MD5,
+ md5_digest, sizeof(md5_digest));
+ dirty = FALSE;
+ }
+
+ if (dirty) {
if (index->mbox_lock_type != MAIL_LOCK_EXCLUSIVE) {
/* try again */
ret = 0;
index->header->flags |= MAIL_INDEX_FLAG_DIRTY_MESSAGES;
rec->index_flags |= INDEX_MAIL_FLAG_DIRTY;
}
- } else {
- /* save MD5 */
- md5_final(&ctx.md5, md5_digest);
- index->update_field_raw(update, DATA_FIELD_MD5,
- md5_digest, sizeof(md5_digest));
}
if (ret <= 0) {
end_offset = start_offset + ctx->content_length;
if (ctx->content_length == (uoff_t)-1 ||
!mbox_verify_end_of_body(ctx->input, end_offset)) {
- if (ctx->content_length != (uoff_t)-1)
+ if (ctx->content_length != (uoff_t)-1) {
i_stream_seek(ctx->input, start_offset);
+ ctx->content_length_broken = TRUE;
+ }
mbox_skip_message(ctx->input);
end_offset = ctx->input->v_offset;
ctx->content_length = end_offset - start_offset;