# HG changeset patch # User Timo Sirainen # Date 1186485791 -10800 # Node ID e6b1432e353f36ce5ea5481dcbcb100315ff5f08 # Parent 01d09f75af4a766b72b5d52f63bfcea640635133 mail_index_map_register_ext() now takes ext_offset instead of hdr_offset. hdr_offset is calculated from ext_offset. Both are stored to the ext struct. diff -r 01d09f75af4a -r e6b1432e353f src/lib-index/mail-index-map.c --- a/src/lib-index/mail-index-map.c Tue Aug 07 14:16:06 2007 +0300 +++ b/src/lib-index/mail-index-map.c Tue Aug 07 14:23:11 2007 +0300 @@ -58,9 +58,15 @@ return (uint32_t)-1; } +static size_t get_ext_size(size_t name_len) +{ + size_t size = sizeof(struct mail_index_ext_header) + name_len; + return MAIL_INDEX_HEADER_SIZE_ALIGN(size); +} + uint32_t mail_index_map_register_ext(struct mail_index_map *map, const char *name, - uint32_t hdr_offset, uint32_t hdr_size, + uint32_t ext_offset, uint32_t hdr_size, uint32_t record_offset, uint32_t record_size, uint32_t record_align, uint32_t reset_id) { @@ -77,7 +83,8 @@ ext = array_append_space(&map->extensions); ext->name = p_strdup(map->extension_pool, name); - ext->hdr_offset = hdr_offset; + ext->ext_offset = ext_offset; + ext->hdr_offset = ext_offset + get_ext_size(strlen(name)); ext->hdr_size = hdr_size; ext->record_offset = record_offset; ext->record_size = record_size; @@ -95,27 +102,13 @@ return idx; } -static bool size_check(size_t *size_left, size_t size) -{ - if (size > *size_left) - return FALSE; - *size_left -= size; - return TRUE; -} - -static size_t get_align(size_t name_len) -{ - size_t size = sizeof(struct mail_index_ext_header) + name_len; - return MAIL_INDEX_HEADER_SIZE_ALIGN(size) - size; -} - static int mail_index_parse_extensions(struct mail_index_map *map) { struct mail_index *index = map->index; const struct mail_index_ext_header *ext_hdr; unsigned int i, old_count; const char *name; - uint32_t ext_id, offset, name_offset; + uint32_t ext_id, ext_offset, offset, name_offset; size_t size_left; /* extension headers always start from 64bit offsets, so if base header @@ -134,6 +127,7 @@ array_append(&map->ext_id_map, &ext_id, 1); for (i = 0; offset < map->hdr.header_size; i++) { + ext_offset = offset; ext_hdr = CONST_PTR_OFFSET(map->hdr_base, offset); /* Extension header contains: @@ -144,19 +138,17 @@ - 64bit alignment padding */ size_left = map->hdr.header_size - offset; - if (!size_check(&size_left, sizeof(*ext_hdr)) || - !size_check(&size_left, ext_hdr->name_size) || - !size_check(&size_left, get_align(ext_hdr->name_size)) || - !size_check(&size_left, ext_hdr->hdr_size)) { + if (size_left < sizeof(*ext_hdr) || + size_left < get_ext_size(ext_hdr->name_size) + + ext_hdr->hdr_size) { mail_index_set_error(index, "Corrupted index file %s: " "Header extension goes outside header", index->filepath); return -1; } - offset += sizeof(*ext_hdr); - name_offset = offset; - offset += ext_hdr->name_size + get_align(ext_hdr->name_size); + name_offset = offset + sizeof(*ext_hdr); + offset += get_ext_size(ext_hdr->name_size); t_push(); name = t_strndup(CONST_PTR_OFFSET(map->hdr_base, name_offset), @@ -201,8 +193,8 @@ return -1; } - mail_index_map_register_ext(map, name, - offset, ext_hdr->hdr_size, + mail_index_map_register_ext(map, name, ext_offset, + ext_hdr->hdr_size, ext_hdr->record_offset, ext_hdr->record_size, ext_hdr->record_align, diff -r 01d09f75af4a -r e6b1432e353f src/lib-index/mail-index-private.h --- a/src/lib-index/mail-index-private.h Tue Aug 07 14:16:06 2007 +0300 +++ b/src/lib-index/mail-index-private.h Tue Aug 07 14:23:11 2007 +0300 @@ -48,6 +48,7 @@ const char *name; uint32_t index_idx; /* index ext_id */ uint32_t reset_id; + uint32_t ext_offset; /* points to beginning of mail_index_ext_header */ uint32_t hdr_offset; /* points to mail_index_ext_header.data[] */ uint32_t hdr_size; /* size of mail_index_ext_header.data[] */ uint16_t record_offset; @@ -287,7 +288,7 @@ const char *name); uint32_t mail_index_map_register_ext(struct mail_index_map *map, const char *name, - uint32_t hdr_offset, uint32_t hdr_size, + uint32_t ext_offset, uint32_t hdr_size, uint32_t record_offset, uint32_t record_size, uint32_t record_align, uint32_t reset_id); bool mail_index_map_get_ext_idx(struct mail_index_map *map, diff -r 01d09f75af4a -r e6b1432e353f src/lib-index/mail-index-sync-ext.c --- a/src/lib-index/mail-index-sync-ext.c Tue Aug 07 14:16:06 2007 +0300 +++ b/src/lib-index/mail-index-sync-ext.c Tue Aug 07 14:23:11 2007 +0300 @@ -123,16 +123,11 @@ get_ext_header(struct mail_index_map *map, const struct mail_index_ext *ext) { struct mail_index_ext_header *ext_hdr; - uint32_t offset; void *hdr_base; /* do some kludgy jumping to get to it. */ - offset = ext->hdr_offset - - MAIL_INDEX_HEADER_SIZE_ALIGN(sizeof(*ext_hdr) + - strlen(ext->name)); - hdr_base = buffer_get_modifiable_data(map->hdr_copy_buf, NULL); - ext_hdr = PTR_OFFSET(hdr_base, offset); + ext_hdr = PTR_OFFSET(hdr_base, ext->ext_offset); i_assert(memcmp((char *)(ext_hdr + 1), ext->name, strlen(ext->name)) == 0); return ext_hdr; @@ -392,6 +387,8 @@ map = mail_index_sync_get_atomic_map(ctx); hdr_buf = map->hdr_copy_buf; + i_assert(hdr_buf->used == map->hdr.header_size); + if (MAIL_INDEX_HEADER_SIZE_ALIGN(hdr_buf->used) != hdr_buf->used) { /* we need to add padding between base header and extensions */ buffer_append_zero(hdr_buf, @@ -401,11 +398,9 @@ /* register record offset initially using zero, sync_ext_reorder() will fix it. */ - hdr_offset = hdr_buf->used + sizeof(ext_hdr) + strlen(name); - hdr_offset = MAIL_INDEX_HEADER_SIZE_ALIGN(hdr_offset); - ext_id = mail_index_map_register_ext(map, name, hdr_offset, u->hdr_size, - 0, u->record_size, u->record_align, - u->reset_id); + ext_id = mail_index_map_register_ext(map, name, hdr_buf->used, + u->hdr_size, 0, u->record_size, + u->record_align, u->reset_id); ext = array_idx(&map->extensions, ext_id);