]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
Rewrite Content-length header if it's broken. UID-validity change checking
authorTimo Sirainen <tss@iki.fi>
Sat, 3 May 2003 17:31:13 +0000 (20:31 +0300)
committerTimo Sirainen <tss@iki.fi>
Sat, 3 May 2003 17:31:13 +0000 (20:31 +0300)
was broken when first message was added to empty mbox.

--HG--
branch : HEAD

src/lib-index/mbox/mbox-append.c
src/lib-index/mbox/mbox-index.c
src/lib-index/mbox/mbox-index.h

index 546b935c67e3a7b4cc166ba808991d0018e6430a..6c8533665f5b40ca6c806f6f4c36ad67085b17dd 100644 (file)
@@ -19,7 +19,7 @@ static int mbox_index_append_next(struct mail_index *index,
        const unsigned char *data;
        unsigned char md5_digest[16];
        size_t size, pos;
-       int ret;
+       int ret, dirty;
 
        /* get the From-line */
        pos = 0;
@@ -91,7 +91,7 @@ static int mbox_index_append_next(struct mail_index *index,
 
        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 */
@@ -116,8 +116,19 @@ static int mbox_index_append_next(struct mail_index *index,
                /* 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;
@@ -125,11 +136,6 @@ static int mbox_index_append_next(struct mail_index *index,
                        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) {
index f00bcd0b903a54f8843ae973da3a4307b21a575c..6cc5eddc380319a03ef2e57fcbaae29c3c0570d0 100644 (file)
@@ -268,8 +268,10 @@ void mbox_header_cb(struct message_part *part __attr_unused__,
                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;
index 5ce4dad2712fc94fa579e91c3da8a10c271d4d0d..8be223dc332edf59a9d3a344dac6748669babad4 100644 (file)
@@ -18,7 +18,7 @@ struct mbox_header_context {
 
        struct istream *input;
        uoff_t content_length;
-       int set_read_limit;
+       int set_read_limit, content_length_broken;
 };
 
 int mbox_set_syscall_error(struct mail_index *index, const char *function);