Mercurial > dovecot > original-hg > dovecot-1.2
changeset 6872:082526b2702e HEAD
Verify extension fields are correct when registering it from transaction
log.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Wed, 28 Nov 2007 15:50:55 +0200 |
parents | f7ec019fd3f6 |
children | 3069e66789b3 |
files | src/lib-index/mail-index-map.c src/lib-index/mail-index-private.h src/lib-index/mail-index-sync-ext.c |
diffstat | 3 files changed, 33 insertions(+), 33 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-index/mail-index-map.c Wed Nov 28 15:50:22 2007 +0200 +++ b/src/lib-index/mail-index-map.c Wed Nov 28 15:50:55 2007 +0200 @@ -69,10 +69,9 @@ } uint32_t -mail_index_map_register_ext(struct mail_index_map *map, const char *name, - uint32_t ext_offset, uint32_t hdr_size, - uint32_t record_offset, uint32_t record_size, - uint32_t record_align, uint32_t reset_id) +mail_index_map_register_ext(struct mail_index_map *map, + const char *name, uint32_t ext_offset, + const struct mail_index_ext_header *ext_hdr) { struct mail_index_ext *ext; uint32_t idx, empty_idx = (uint32_t)-1; @@ -90,14 +89,16 @@ ext->ext_offset = ext_offset; ext->hdr_offset = ext_offset + mail_index_map_ext_hdr_offset(strlen(name)); - ext->hdr_size = hdr_size; - ext->record_offset = record_offset; - ext->record_size = record_size; - ext->record_align = record_align; - ext->reset_id = reset_id; + ext->hdr_size = ext_hdr->hdr_size; + ext->record_offset = ext_hdr->record_offset; + ext->record_size = ext_hdr->record_size; + ext->record_align = ext_hdr->record_align; + ext->reset_id = ext_hdr->reset_id; - ext->index_idx = mail_index_ext_register(map->index, name, hdr_size, - record_size, record_align); + ext->index_idx = mail_index_ext_register(map->index, name, + ext_hdr->hdr_size, + ext_hdr->record_size, + ext_hdr->record_align); /* Update index ext_id -> map ext_id mapping. Fill non-used ext_ids with (uint32_t)-1 */ @@ -238,12 +239,7 @@ return -1; } - 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, - ext_hdr->reset_id); + mail_index_map_register_ext(map, name, ext_offset, ext_hdr); t_pop(); } return 0;
--- a/src/lib-index/mail-index-private.h Wed Nov 28 15:50:22 2007 +0200 +++ b/src/lib-index/mail-index-private.h Wed Nov 28 15:50:55 2007 +0200 @@ -283,10 +283,9 @@ bool mail_index_map_lookup_ext(struct mail_index_map *map, const char *name, uint32_t *idx_r); uint32_t -mail_index_map_register_ext(struct mail_index_map *map, const char *name, - uint32_t ext_offset, uint32_t hdr_size, - uint32_t record_offset, uint32_t record_size, - uint32_t record_align, uint32_t reset_id); +mail_index_map_register_ext(struct mail_index_map *map, + const char *name, uint32_t ext_offset, + const struct mail_index_ext_header *ext_hdr); bool mail_index_map_get_ext_idx(struct mail_index_map *map, uint32_t ext_id, uint32_t *idx_r); const struct mail_index_ext *
--- a/src/lib-index/mail-index-sync-ext.c Wed Nov 28 15:50:22 2007 +0200 +++ b/src/lib-index/mail-index-sync-ext.c Wed Nov 28 15:50:55 2007 +0200 @@ -357,7 +357,7 @@ struct mail_index_map *map = ctx->view->map; struct mail_index_ext_header ext_hdr; const struct mail_index_ext *ext; - const char *name; + const char *name, *error; buffer_t *hdr_buf; uint32_t ext_map_idx; @@ -438,23 +438,28 @@ hdr_buf->used); } + memset(&ext_hdr, 0, sizeof(ext_hdr)); + ext_hdr.name_size = strlen(name); + ext_hdr.reset_id = u->reset_id; + ext_hdr.hdr_size = u->hdr_size; + ext_hdr.record_size = u->record_size; + ext_hdr.record_align = u->record_align; + + if (mail_index_map_ext_hdr_check(&map->hdr, &ext_hdr, + name, &error) < 0) { + mail_index_sync_set_corrupted(ctx, + "Broken extension introduction: %s", error); + t_pop(); + return -1; + } + /* register record offset initially using zero, sync_ext_reorder() will fix it. */ ext_map_idx = mail_index_map_register_ext(map, name, hdr_buf->used, - u->hdr_size, 0, - u->record_size, - u->record_align, u->reset_id); - + &ext_hdr); ext = array_idx(&map->extensions, ext_map_idx); /* <ext_hdr> <name> [padding] [header data] */ - memset(&ext_hdr, 0, sizeof(ext_hdr)); - ext_hdr.name_size = strlen(name); - ext_hdr.reset_id = ext->reset_id; - ext_hdr.hdr_size = ext->hdr_size; - ext_hdr.record_offset = ext->record_offset; - ext_hdr.record_size = ext->record_size; - ext_hdr.record_align = ext->record_align; buffer_append(hdr_buf, &ext_hdr, sizeof(ext_hdr)); buffer_append(hdr_buf, name, strlen(name)); /* header must begin and end in correct alignment */