Mercurial > dovecot > core-2.2
changeset 16292:c473f8d2540e
mbox: Handle broken Status: and X-Status: headers without sync errors.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Tue, 16 Apr 2013 20:08:18 +0300 |
parents | 854469baa57c |
children | 7f00331058ef |
files | src/lib-storage/index/mbox/mbox-sync-parse.c src/lib-storage/index/mbox/mbox-sync-private.h src/lib-storage/index/mbox/mbox-sync-update.c |
diffstat | 3 files changed, 19 insertions(+), 7 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-storage/index/mbox/mbox-sync-parse.c Tue Apr 16 16:20:30 2013 +0300 +++ b/src/lib-storage/index/mbox/mbox-sync-parse.c Tue Apr 16 20:08:18 2013 +0300 @@ -79,24 +79,31 @@ return 0; } -static void parse_status_flags(struct mbox_sync_mail_context *ctx, +static bool parse_status_flags(struct mbox_sync_mail_context *ctx, struct message_header_line *hdr, struct mbox_flag_type *flags_list) { + enum mail_flags flag; size_t i; + bool duplicates = FALSE; ctx->mail.flags ^= MBOX_NONRECENT_KLUDGE; for (i = 0; i < hdr->full_value_len; i++) { - ctx->mail.flags |= - mbox_flag_find(flags_list, hdr->full_value[i]); + flag = mbox_flag_find(flags_list, hdr->full_value[i]); + if ((ctx->mail.flags & flag) != 0) + duplicates = TRUE; + else + ctx->mail.flags |= flag; } ctx->mail.flags ^= MBOX_NONRECENT_KLUDGE; + return duplicates; } static bool parse_status(struct mbox_sync_mail_context *ctx, struct message_header_line *hdr) { - parse_status_flags(ctx, hdr, mbox_status_flags); + if (parse_status_flags(ctx, hdr, mbox_status_flags)) + ctx->mail.status_broken = TRUE; ctx->hdr_pos[MBOX_HDR_STATUS] = str_len(ctx->header); return TRUE; } @@ -104,7 +111,8 @@ static bool parse_x_status(struct mbox_sync_mail_context *ctx, struct message_header_line *hdr) { - parse_status_flags(ctx, hdr, mbox_xstatus_flags); + if (parse_status_flags(ctx, hdr, mbox_xstatus_flags)) + ctx->mail.xstatus_broken = TRUE; ctx->hdr_pos[MBOX_HDR_X_STATUS] = str_len(ctx->header); return TRUE; }
--- a/src/lib-storage/index/mbox/mbox-sync-private.h Tue Apr 16 16:20:30 2013 +0300 +++ b/src/lib-storage/index/mbox/mbox-sync-private.h Tue Apr 16 20:08:18 2013 +0300 @@ -52,6 +52,8 @@ unsigned int uid_broken:1; unsigned int expunged:1; unsigned int pseudo:1; + unsigned int status_broken:1; + unsigned int xstatus_broken:1; uoff_t from_offset; uoff_t body_size;
--- a/src/lib-storage/index/mbox/mbox-sync-update.c Tue Apr 16 16:20:30 2013 +0300 +++ b/src/lib-storage/index/mbox/mbox-sync-update.c Tue Apr 16 20:08:18 2013 +0300 @@ -409,7 +409,8 @@ mbox_sync_update_header_from_real(struct mbox_sync_mail_context *ctx, const struct mbox_sync_mail *mail) { - if ((ctx->mail.flags & STATUS_FLAGS_MASK) != + if (mail->status_broken || + (ctx->mail.flags & STATUS_FLAGS_MASK) != (mail->flags & STATUS_FLAGS_MASK) || (ctx->mail.flags & MAIL_RECENT) != 0) { ctx->mail.flags = (ctx->mail.flags & ~STATUS_FLAGS_MASK) | @@ -418,7 +419,8 @@ ctx->mail.flags &= ~MAIL_RECENT; mbox_sync_update_status(ctx); } - if ((ctx->mail.flags & XSTATUS_FLAGS_MASK) != + if (mail->xstatus_broken || + (ctx->mail.flags & XSTATUS_FLAGS_MASK) != (mail->flags & XSTATUS_FLAGS_MASK)) { ctx->mail.flags = (ctx->mail.flags & ~XSTATUS_FLAGS_MASK) | (mail->flags & XSTATUS_FLAGS_MASK);