From: Timo Sirainen Date: Mon, 28 Jun 2004 21:32:29 +0000 (+0300) Subject: Several fixes for updating mbox. Recent changes also made it corrupt X-Git-Tag: 1.1.alpha1~3857 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=d371507847d62ba311b4bcc23d18f45c3d0f1a38;p=thirdparty%2Fdovecot%2Fcore.git Several fixes for updating mbox. Recent changes also made it corrupt headers. --HG-- branch : HEAD --- diff --git a/src/lib-storage/index/mbox/mbox-sync-parse.c b/src/lib-storage/index/mbox/mbox-sync-parse.c index 9705bef060..6f9cfbc701 100644 --- a/src/lib-storage/index/mbox/mbox-sync-parse.c +++ b/src/lib-storage/index/mbox/mbox-sync-parse.c @@ -398,9 +398,12 @@ void mbox_sync_parse_next_mail(struct istream *input, func = header_func_find(hdr->name); if (func != NULL) { - if (hdr->continues) + if (hdr->continues) { hdr->use_full_value = TRUE; - else if (!func->func(ctx, hdr)) { + continue; + } + + if (!func->func(ctx, hdr)) { /* this header is broken, remove it */ ctx->need_rewrite = TRUE; str_truncate(ctx->header, line_start_pos); diff --git a/src/lib-storage/index/mbox/mbox-sync-private.h b/src/lib-storage/index/mbox/mbox-sync-private.h index 2430638427..a61ed4eea7 100644 --- a/src/lib-storage/index/mbox/mbox-sync-private.h +++ b/src/lib-storage/index/mbox/mbox-sync-private.h @@ -120,5 +120,7 @@ int mbox_sync_rewrite(struct mbox_sync_context *sync_ctx, uoff_t extra_space, int mbox_sync_seek(struct mbox_sync_context *sync_ctx, uoff_t from_offset); int mbox_move(struct mbox_sync_context *sync_ctx, uoff_t dest, uoff_t source, uoff_t size); +void mbox_sync_move_buffer(struct mbox_sync_mail_context *ctx, + size_t pos, size_t need, size_t have); #endif diff --git a/src/lib-storage/index/mbox/mbox-sync-rewrite.c b/src/lib-storage/index/mbox/mbox-sync-rewrite.c index 71139cc54e..498e8ab911 100644 --- a/src/lib-storage/index/mbox/mbox-sync-rewrite.c +++ b/src/lib-storage/index/mbox/mbox-sync-rewrite.c @@ -148,7 +148,7 @@ static void mbox_sync_header_remove_space(struct mbox_sync_mail_context *ctx, if (data_size - start_pos <= *size) { /* remove it all */ - str_delete(ctx->header, start_pos, data_size - start_pos); + mbox_sync_move_buffer(ctx, start_pos, 0, data_size - start_pos); *size -= data_size - start_pos; return; } @@ -156,7 +156,7 @@ static void mbox_sync_header_remove_space(struct mbox_sync_mail_context *ctx, /* we have more space than needed. since we're removing from the beginning of header instead of end, we don't have to worry about multiline-headers. */ - str_delete(ctx->header, start_pos, *size); + mbox_sync_move_buffer(ctx, start_pos, 0, *size); if (last_line_pos <= start_pos + *size) last_line_pos = start_pos; else diff --git a/src/lib-storage/index/mbox/mbox-sync-update.c b/src/lib-storage/index/mbox/mbox-sync-update.c index 519f534385..3a9b36c16d 100644 --- a/src/lib-storage/index/mbox/mbox-sync-update.c +++ b/src/lib-storage/index/mbox/mbox-sync-update.c @@ -17,8 +17,8 @@ static void status_flags_append(struct mbox_sync_mail_context *ctx, } } -static void mbox_sync_move_buffer(struct mbox_sync_mail_context *ctx, - size_t pos, size_t need, size_t have) +void mbox_sync_move_buffer(struct mbox_sync_mail_context *ctx, + size_t pos, size_t need, size_t have) { ssize_t diff = (ssize_t)need - (ssize_t)have; int i; @@ -126,8 +126,9 @@ static void mbox_sync_add_missing_headers(struct mbox_sync_mail_context *ctx) ctx->sync_ctx->hdr->uid_validity; } + str_append(ctx->header, "X-IMAPbase: "); ctx->hdr_pos[MBOX_HDR_X_IMAPBASE] = str_len(ctx->header); - str_printfa(ctx->header, "X-IMAPbase: %u %010u", + str_printfa(ctx->header, "%u %010u", ctx->sync_ctx->base_uid_validity, ctx->sync_ctx->next_uid-1); //FIXME:keywords_append(ctx, all_keywords); @@ -135,24 +136,25 @@ static void mbox_sync_add_missing_headers(struct mbox_sync_mail_context *ctx) } if (ctx->hdr_pos[MBOX_HDR_X_UID] == (size_t)-1) { + str_append(ctx->header, "X-UID: "); ctx->hdr_pos[MBOX_HDR_X_UID] = str_len(ctx->header); - str_printfa(ctx->header, "X-UID: %u\n", ctx->mail.uid); + str_printfa(ctx->header, "%u\n", ctx->mail.uid); } if (ctx->hdr_pos[MBOX_HDR_STATUS] == (size_t)-1 && (ctx->mail.flags & STATUS_FLAGS_MASK) != 0) { if (!ctx->sync_ctx->ibox->keep_recent) ctx->mail.flags |= MBOX_NONRECENT; - ctx->hdr_pos[MBOX_HDR_STATUS] = str_len(ctx->header); str_append(ctx->header, "Status: "); + ctx->hdr_pos[MBOX_HDR_STATUS] = str_len(ctx->header); status_flags_append(ctx, mbox_status_flags); str_append_c(ctx->header, '\n'); } if (ctx->hdr_pos[MBOX_HDR_X_STATUS] == (size_t)-1 && (ctx->mail.flags & XSTATUS_FLAGS_MASK) != 0) { - ctx->hdr_pos[MBOX_HDR_X_STATUS] = str_len(ctx->header); str_append(ctx->header, "X-Status: "); + ctx->hdr_pos[MBOX_HDR_X_STATUS] = str_len(ctx->header); status_flags_append(ctx, mbox_xstatus_flags); str_append_c(ctx->header, '\n'); } @@ -166,8 +168,8 @@ static void mbox_sync_add_missing_headers(struct mbox_sync_mail_context *ctx) } if (ctx->hdr_pos[MBOX_HDR_X_KEYWORDS] == (size_t)-1 && have_keywords) { - ctx->hdr_pos[MBOX_HDR_X_KEYWORDS] = str_len(ctx->header); str_append(ctx->header, "X-Keywords: "); + ctx->hdr_pos[MBOX_HDR_X_KEYWORDS] = str_len(ctx->header); keywords_append(ctx, ctx->mail.keywords); str_append_c(ctx->header, '\n'); }