Mercurial > dovecot > original-hg > dovecot-1.2
changeset 23:6cefb1763f3e HEAD
mbox fixes, fsck and sync seems to work now.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Sat, 24 Aug 2002 15:03:29 +0300 |
parents | a946ce1f09b7 |
children | e8de6f485c65 |
files | src/lib-index/mbox/mbox-fsck.c src/lib-index/mbox/mbox-sync.c |
diffstat | 2 files changed, 20 insertions(+), 12 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-index/mbox/mbox-fsck.c Sat Aug 24 05:04:45 2002 +0300 +++ b/src/lib-index/mbox/mbox-fsck.c Sat Aug 24 15:03:29 2002 +0300 @@ -37,7 +37,7 @@ { MessageSize hdr_size; MboxHeaderContext ctx; - off_t old_offset; + off_t body_offset; unsigned char *data, current_digest[16], old_digest[16]; unsigned int size; const char *md5sum; @@ -51,8 +51,8 @@ message_parse_header(NULL, inbuf, &hdr_size, mbox_header_func, &ctx); md5_final(&ctx.md5, current_digest); + body_offset = inbuf->offset; do { - old_offset = inbuf->offset; do { /* MD5 sums must match */ md5sum = index->lookup_field(index, rec, @@ -66,7 +66,7 @@ /* don't bother parsing the whole body, just make sure it ends properly */ - io_buffer_skip(inbuf, rec->body_size); + io_buffer_seek(inbuf, body_offset + rec->body_size); if (inbuf->offset == inbuf->size) { /* last message */ @@ -89,10 +89,6 @@ return rec; } while (0); - /* get back to beginning of message body */ - if (inbuf->offset != old_offset) - io_buffer_seek(inbuf, old_offset); - /* try next message */ (*seq)++; (void)index->expunge(index, rec, *seq, TRUE); @@ -105,6 +101,7 @@ static int mbox_index_fsck_buf(MailIndex *index, IOBuffer *inbuf) { MailIndexRecord *rec; + off_t from_offset; unsigned char *data; unsigned int seq, size; @@ -135,6 +132,7 @@ rec = index->lookup(index, 1); while (rec != NULL) { + from_offset = inbuf->offset; if (inbuf->offset != 0) { /* we're at the [\r]\n before the From-line, skip it */ @@ -149,8 +147,11 @@ break; rec = match_next_record(index, rec, &seq, inbuf); - if (rec == NULL) + if (rec == NULL) { + /* Get back to line before From */ + io_buffer_seek(inbuf, from_offset); break; + } seq++; rec = index->next(index, rec);
--- a/src/lib-index/mbox/mbox-sync.c Sat Aug 24 05:04:45 2002 +0300 +++ b/src/lib-index/mbox/mbox-sync.c Sat Aug 24 15:03:29 2002 +0300 @@ -2,6 +2,7 @@ #include "lib.h" #include "iobuffer.h" +#include "hex-binary.h" #include "mbox-index.h" #include "mail-index-util.h" @@ -14,7 +15,7 @@ { MailIndexRecord *rec, *prev; const char *location; - unsigned long size; + off_t size; if (index->lock_type == MAIL_LOCK_UNLOCK) { if (!mail_index_set_lock(index, MAIL_LOCK_SHARED)) @@ -44,15 +45,21 @@ index_set_error(index, "Corrupted index file %s: " "Missing location field for record %u", index->filepath, rec->uid); + } else if (strlen(location) != sizeof(size)*2 || + hex_to_binary(location, + (unsigned char *) &size) <= 0) { + INDEX_MARK_CORRUPTED(index); + index_set_error(index, "Corrupted index file %s: " + "Invalid location field for record %u", + index->filepath, rec->uid); } else { - size = strtoul(location, NULL, 10) + - rec->header_size + rec->body_size; + size += rec->header_size + rec->body_size; } } if (index->lock_type == MAIL_LOCK_SHARED) (void)mail_index_set_lock(index, MAIL_LOCK_UNLOCK); - return (off_t)size; + return size; } static int mbox_check_new_mail(MailIndex *index)