Mercurial > dovecot > original-hg > dovecot-1.2
changeset 1933:bfdff8c75965 HEAD
fixes for mmap_disable
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Thu, 29 Apr 2004 02:15:44 +0300 |
parents | f04ff2a2ad5d |
children | 08159fcf9eb8 |
files | src/lib-index/mail-transaction-log-private.h src/lib-index/mail-transaction-log-view.c src/lib-index/mail-transaction-log.c src/lib-index/mail-transaction-util.c |
diffstat | 4 files changed, 35 insertions(+), 23 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-index/mail-transaction-log-private.h Thu Apr 29 00:41:56 2004 +0300 +++ b/src/lib-index/mail-transaction-log-private.h Thu Apr 29 02:15:44 2004 +0300 @@ -20,7 +20,6 @@ buffer_t *buffer; uoff_t buffer_offset; - size_t buffer_size; void *mmap_base; size_t mmap_size;
--- a/src/lib-index/mail-transaction-log-view.c Thu Apr 29 00:41:56 2004 +0300 +++ b/src/lib-index/mail-transaction-log-view.c Thu Apr 29 02:15:44 2004 +0300 @@ -176,7 +176,7 @@ const struct mail_transaction_type_map *type_rec; const void *data; unsigned int record_size; - size_t size; + size_t file_size; view->prev_file_seq = file->hdr.file_seq; view->prev_file_offset = view->file_offset; @@ -187,24 +187,27 @@ return 0; } - data = buffer_get_data(file->buffer, &size); - if (view->file_offset + sizeof(*hdr) > file->hdr.used_size) { + data = buffer_get_data(file->buffer, &file_size); + file_size += file->buffer_offset; + + if (view->file_offset + sizeof(*hdr) > file_size) { mail_transaction_log_file_set_corrupted(file, - "offset points outside file (%u + %"PRIuSIZE_T" > %u)", - view->file_offset, sizeof(*hdr), size); + "offset points outside file " + "(%"PRIuUOFF_T" + %"PRIuSIZE_T" > %"PRIuSIZE_T")", + view->file_offset, sizeof(*hdr), file_size); return -1; } hdr = CONST_PTR_OFFSET(data, view->file_offset - file->buffer_offset); view->file_offset += sizeof(*hdr); - if (file->hdr.used_size - view->file_offset < hdr->size) { + if (file_size - view->file_offset < hdr->size) { mail_transaction_log_file_set_corrupted(file, - "record size too large " - "(type=0x%x, offset=%u, size=%u, end=%u)", + "record size too large (type=0x%x, offset=%"PRIuUOFF_T + ", size=%u, end=%"PRIuSIZE_T")", hdr->type & MAIL_TRANSACTION_TYPE_MASK, - view->file_offset, hdr->size, file->hdr.used_size); - view->file_offset = file->hdr.used_size; + view->file_offset, hdr->size, file_size); + view->file_offset = file_size; return -1; }
--- a/src/lib-index/mail-transaction-log.c Thu Apr 29 00:41:56 2004 +0300 +++ b/src/lib-index/mail-transaction-log.c Thu Apr 29 02:15:44 2004 +0300 @@ -237,7 +237,8 @@ if (ret < 0) { // FIXME: handle ESTALE mail_index_file_set_syscall_error(file->log->index, - file->filepath, "pread()"); + file->filepath, + "pread_full()"); return -1; } if (ret == 0) { @@ -577,7 +578,7 @@ file->buffer_offset = offset; data = buffer_get_space_unsafe(file->buffer, 0, size); - ret = pread(file->fd, data, size, offset); + ret = pread_full(file->fd, data, size, offset); if (ret < 0 && errno == ESTALE) { /* log file was deleted in NFS server, fail silently */ ret = 0; @@ -599,6 +600,7 @@ return 1; } } + offset = file->buffer_offset + size; size = file->hdr.used_size - file->buffer_offset - size; if (size == 0) @@ -606,7 +608,7 @@ data = buffer_append_space_unsafe(file->buffer, size); - ret = pread(file->fd, data, size, offset); + ret = pread_full(file->fd, data, size, offset); if (ret < 0 && errno == ESTALE) { /* log file was deleted in NFS server, fail silently */ ret = 0; @@ -647,7 +649,8 @@ return -1; } - if (st.st_size == file->hdr.used_size && end_offset == (uoff_t)-1) { + if (st.st_size == file->hdr.used_size && + file->buffer_offset <= start_offset && end_offset == (uoff_t)-1) { /* we've seen the whole file.. do we have all of it mapped? */ size = buffer_get_used_size(file->buffer); if (file->buffer_offset + size == file->hdr.used_size) @@ -689,15 +692,20 @@ if (!use_mmap) { ret = mail_transaction_log_file_read(file, start_offset); if (ret <= 0) { + if (ret < 0) { + mail_index_file_set_syscall_error(index, + file->filepath, "pread_full()"); + } else { + mail_transaction_log_file_set_corrupted(file, + "Unexpected EOF"); + } + /* make sure we don't leave ourself in inconsistent state */ if (file->buffer != NULL) { buffer_free(file->buffer); file->buffer = NULL; } - file->buffer_size = 0; - } else { - file->buffer_size = buffer_get_used_size(file->buffer); } return ret; } @@ -713,7 +721,7 @@ } file->buffer = buffer_create_const_data(default_pool, file->mmap_base, file->mmap_size); - file->buffer_size = buffer_get_used_size(file->buffer); + file->buffer_offset = 0; return 1; }
--- a/src/lib-index/mail-transaction-util.c Thu Apr 29 00:41:56 2004 +0300 +++ b/src/lib-index/mail-transaction-util.c Thu Apr 29 02:15:44 2004 +0300 @@ -152,8 +152,9 @@ prev_seq = dest[i].seq2+1; } - new_exp.seq1 = src->seq1 + expunges_before; - new_exp.seq2 = src->seq2 + expunges_before; + new_exp = *src; + new_exp.seq1 += expunges_before; + new_exp.seq2 += expunges_before; /* if src[] is in format {1,2}{1,2} rather than {1,2}{3,4}: expunges_before += new_exp.seq2 - new_exp.seq1 + 1;*/ @@ -164,12 +165,14 @@ count = dest[i].seq2 - dest[i].seq1 + 1; expunges_before += count; new_exp.seq2 += count; + new_exp.seq2 = dest[i].uid2; i++; } if (first > 0 && new_exp.seq1 == dest[first-1].seq2+1) { /* continue previous record */ dest[first-1].seq2 = new_exp.seq2; + dest[first-1].uid2 = new_exp.uid2; } else if (i == first) { buffer_insert(expunges_buf, i * sizeof(new_exp), &new_exp, sizeof(new_exp)); @@ -179,8 +182,7 @@ dest_count++; } else { /* use next record */ - dest[first].seq1 = new_exp.seq1; - dest[first].seq2 = new_exp.seq2; + dest[first] = new_exp; first++; }