changeset 334:e34e14d758eb HEAD

Cached MessagePart reading wasn't working because alignment broke the strict size checking.
author Timo Sirainen <tss@iki.fi>
date Mon, 30 Sep 2002 02:08:18 +0300
parents fad3998041d4
children 526ebe074df1
files src/lib-index/mail-index-update.c src/lib-index/mail-index-util.c src/lib-index/mail-index.h src/lib-index/mbox/mbox-fsck.c src/lib-index/mbox/mbox-index.c src/lib-mail/message-part-serialize.c src/lib-storage/index/index-msgcache.c
diffstat 7 files changed, 13 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-index/mail-index-update.c	Mon Sep 30 01:08:29 2002 +0300
+++ b/src/lib-index/mail-index-update.c	Mon Sep 30 02:08:18 2002 +0300
@@ -416,8 +416,7 @@
 			if (part == NULL) {
 				/* corrupted, rebuild it */
 				index_set_corrupted(update->index,
-						    "Corrupted cached "
-						    "MessagePart data");
+					"Corrupted cached MessagePart data");
 			}
 		}
 
--- a/src/lib-index/mail-index-util.c	Mon Sep 30 01:08:29 2002 +0300
+++ b/src/lib-index/mail-index-util.c	Mon Sep 30 02:08:18 2002 +0300
@@ -129,9 +129,8 @@
 		if (!message_part_deserialize_size(part_data, size,
 						   &hdr_size, &body_size)) {
 			/* corrupted, ignore */
-			index_set_error(index, "Error in index file %s: "
-					"Corrupted cached MessagePart data",
-					index->filepath);
+			index_set_corrupted(index,
+				"Corrupted cached MessagePart data");
 		} else {
 			*virtual_size = hdr_size.virtual_size +
 				body_size.virtual_size;
--- a/src/lib-index/mail-index.h	Mon Sep 30 01:08:29 2002 +0300
+++ b/src/lib-index/mail-index.h	Mon Sep 30 02:08:18 2002 +0300
@@ -289,6 +289,8 @@
 
 	void (*update_field)(MailIndexUpdate *update, MailField field,
 			     const char *value, size_t extra_space);
+	/* Just remember that full_field_size will be MEM_ALIGNed, so
+	   it may differer from the given size parameter. */
 	void (*update_field_raw)(MailIndexUpdate *update, MailField field,
 				 const void *value, size_t size);
 
--- a/src/lib-index/mbox/mbox-fsck.c	Mon Sep 30 01:08:29 2002 +0300
+++ b/src/lib-index/mbox/mbox-fsck.c	Mon Sep 30 02:08:18 2002 +0300
@@ -37,7 +37,7 @@
 
 	/* MD5 sums must match */
 	old_digest = index->lookup_field_raw(index, rec, FIELD_TYPE_MD5, &size);
-	return old_digest != NULL && size == 16 &&
+	return old_digest != NULL && size >= 16 &&
                 memcmp(old_digest, current_digest, 16) == 0;
 }
 
--- a/src/lib-index/mbox/mbox-index.c	Mon Sep 30 01:08:29 2002 +0300
+++ b/src/lib-index/mbox/mbox-index.c	Mon Sep 30 02:08:18 2002 +0300
@@ -402,7 +402,7 @@
 					 "for record %u", rec->uid);
 		*offset = 0;
 		return FALSE;
-	} else if (size != sizeof(uoff_t) || *location > OFF_T_MAX) {
+	} else if (size < sizeof(uoff_t) || *location > OFF_T_MAX) {
 		index_data_set_corrupted(index->data, "Invalid location field "
 					 "for record %u", rec->uid);
 		*offset = 0;
--- a/src/lib-mail/message-part-serialize.c	Mon Sep 30 01:08:29 2002 +0300
+++ b/src/lib-mail/message-part-serialize.c	Mon Sep 30 02:08:18 2002 +0300
@@ -146,7 +146,7 @@
 	size_t count;
 
 	/* make sure it looks valid */
-	if (size == 0 || (size % sizeof(SerializedMessagePart)) != 0)
+	if (size < sizeof(SerializedMessagePart))
 		return NULL;
 
 	spart = data;
@@ -167,7 +167,7 @@
 	size_t i, count;
 
 	/* make sure it looks valid */
-	if (size == 0 || (size % sizeof(SerializedMessagePart)) != 0)
+	if (size < sizeof(SerializedMessagePart))
 		return FALSE;
 
 	if (hdr_size->physical_size >= OFF_T_MAX ||
@@ -204,7 +204,7 @@
         const SerializedMessagePart *spart = data;
 
 	/* make sure it looks valid */
-	if (size == 0 || (size % sizeof(SerializedMessagePart)) != 0)
+	if (size < sizeof(SerializedMessagePart))
 		return FALSE;
 
 	hdr_size->physical_size = spart->header_physical_size;
--- a/src/lib-storage/index/index-msgcache.c	Mon Sep 30 01:08:29 2002 +0300
+++ b/src/lib-storage/index/index-msgcache.c	Mon Sep 30 02:08:18 2002 +0300
@@ -5,6 +5,7 @@
 #include "imap-message-cache.h"
 #include "message-part-serialize.h"
 #include "mail-index.h"
+#include "mail-index-util.h"
 
 #include <unistd.h>
 
@@ -83,8 +84,8 @@
 
 	part = message_part_deserialize(pool, part_data, part_size);
 	if (part == NULL) {
-		i_error("Error in index file %s: Corrupted cached "
-			"MessagePart data", ctx->index->filepath);
+		index_set_corrupted(ctx->index,
+				    "Corrupted cached MessagePart data");
 		return NULL;
 	}