changeset 53:37a388fe4dab HEAD

bugfixes for overflow checks :)
author Timo Sirainen <tss@iki.fi>
date Wed, 28 Aug 2002 00:51:00 +0300
parents d5f0f634b86e
children 71fc142c2d7b
files src/lib-index/mail-index-data.c src/lib-index/mail-index-update.c src/lib-index/mail-index.c
diffstat 3 files changed, 21 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-index/mail-index-data.c	Wed Aug 28 00:36:06 2002 +0300
+++ b/src/lib-index/mail-index-data.c	Wed Aug 28 00:51:00 2002 +0300
@@ -295,7 +295,7 @@
 
 	if (index_rec->data_position > data->mmap_length ||
 	    (data->mmap_length -
-	     index_rec->data_position > index_rec->data_size)) {
+	     index_rec->data_position < index_rec->data_size)) {
 		INDEX_MARK_CORRUPTED(data->index);
 		index_set_error(data->index, "Error in data file %s: "
 				"Given data size larger than file size "
--- a/src/lib-index/mail-index-update.c	Wed Aug 28 00:36:06 2002 +0300
+++ b/src/lib-index/mail-index-update.c	Wed Aug 28 00:51:00 2002 +0300
@@ -11,6 +11,7 @@
 #include "imap-bodystructure.h"
 #include "mail-index.h"
 #include "mail-index-data.h"
+#include "mail-index-util.h"
 
 struct _MailIndexUpdate {
 	Pool pool;
@@ -130,6 +131,9 @@
 
 	if (max_size > INT_MAX) {
 		/* rec->data_size most likely corrupted */
+		index_set_error(update->index, "Error in index file %s: "
+				"data_size points outside file",
+				update->index->filepath);
 		update->index->header->flags |= MAIL_INDEX_FLAG_REBUILD;
 		return FALSE;
 	}
@@ -161,9 +165,13 @@
 			continue;
 		}
 
-		if (src_size > max_size || max_size - src_size > pos) {
+		if (src_size > max_size || max_size - src_size < pos) {
 			/* corrupted data file - old value had a field
 			   larger than expected */
+			index_set_error(update->index,
+					"Error in index file %s: "
+					"full_field_size points outside "
+					"data_size", update->index->filepath);
 			update->index->header->flags |= MAIL_INDEX_FLAG_REBUILD;
 			return FALSE;
 		}
--- a/src/lib-index/mail-index.c	Wed Aug 28 00:36:06 2002 +0300
+++ b/src/lib-index/mail-index.c	Wed Aug 28 00:51:00 2002 +0300
@@ -40,9 +40,9 @@
 	}
 
 	if (index->mmap_length < sizeof(MailIndexHeader)) {
-                INDEX_MARK_CORRUPTED(index);
 		index_set_error(index, "truncated index file %s",
 				index->filepath);
+                INDEX_MARK_CORRUPTED(index);
 		return FALSE;
 	}
 
@@ -988,6 +988,9 @@
 	datarec = mail_index_data_lookup(index->data, rec, field);
 	if (datarec == NULL) {
 		/* corrupted, the field should have been there */
+		index_set_error(index, "Error in index file %s: "
+				"Field not found from data file",
+				index->filepath);
 		INDEX_MARK_CORRUPTED(index);
 		return NULL;
 	}
@@ -1135,7 +1138,10 @@
 			return FALSE;
 	}
 
-	mail_hash_update(index->hash, rec->uid, 0);
+	/* expunge() may be called while index is being rebuilt and when
+	   there's no hash yet */
+	if (index->hash != NULL)
+		mail_hash_update(index->hash, rec->uid, 0);
 
 	/* setting UID to 0 is enough for deleting the mail from index */
 	rec->uid = 0;
@@ -1185,6 +1191,9 @@
 	/* update message counts */
 	if (hdr->messages_count == 0) {
 		/* corrupted */
+		index_set_error(index, "Error in index file %s: "
+				"Header says there's no mail while expunging",
+				index->filepath);
 		INDEX_MARK_CORRUPTED(index);
 		return FALSE;
 	}