Mercurial > dovecot > original-hg > dovecot-1.2
changeset 5861:70bfd5adab79 HEAD
Fixed map cloning in the middle of syncing.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Mon, 02 Jul 2007 22:18:50 +0300 |
parents | 159929f53161 |
children | e5acd078fb41 |
files | src/lib-index/mail-index-map.c |
diffstat | 1 files changed, 8 insertions(+), 21 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-index/mail-index-map.c Mon Jul 02 21:20:19 2007 +0300 +++ b/src/lib-index/mail-index-map.c Mon Jul 02 22:18:50 2007 +0300 @@ -803,11 +803,8 @@ static void mail_index_map_copy(struct mail_index_map *dest, const struct mail_index_map *src) { - const struct mail_index_header *src_hdr; size_t size; - src_hdr = src->mmap_base != NULL ? src->mmap_base : src->hdr_base; - /* copy records */ size = src->records_count * src->hdr.record_size; dest->buffer = buffer_create_dynamic(default_pool, size); @@ -816,20 +813,9 @@ dest->records = buffer_get_modifiable_data(dest->buffer, NULL); dest->records_count = src->records_count; - if (src->mmap_base == NULL) - dest->hdr = src->hdr; - else { - /* refresh the header */ - memcpy(&dest->hdr, src_hdr, src->hdr.base_header_size); - /* fix base header size if needed */ - if (dest->hdr.base_header_size < sizeof(dest->hdr)) { - dest->hdr.base_header_size = sizeof(dest->hdr); - dest->hdr.header_size += - sizeof(dest->hdr) - dest->hdr.base_header_size; - } - } - - /* copy header */ + /* copy header. use src->hdr copy directly, because if we got here + from syncing it has the latest changes. */ + dest->hdr = src->hdr; if (dest->hdr_copy_buf != NULL) buffer_set_used_size(dest->hdr_copy_buf, 0); else { @@ -837,10 +823,11 @@ buffer_create_dynamic(default_pool, dest->hdr.header_size); } - buffer_append(dest->hdr_copy_buf, &dest->hdr, sizeof(dest->hdr)); - buffer_append(dest->hdr_copy_buf, - CONST_PTR_OFFSET(src_hdr, src_hdr->base_header_size), - src_hdr->header_size - src_hdr->base_header_size); + buffer_append(dest->hdr_copy_buf, &dest->hdr, + I_MIN(sizeof(dest->hdr), src->hdr.base_header_size)); + buffer_write(dest->hdr_copy_buf, src->hdr.base_header_size, + CONST_PTR_OFFSET(src->hdr_base, src->hdr.base_header_size), + src->hdr.header_size - src->hdr.base_header_size); dest->hdr_base = buffer_get_modifiable_data(dest->hdr_copy_buf, NULL); }