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 */