changeset 2354:1556d9ba23dc HEAD

Assert crashfix in certain situations when adding new cache records.
author Timo Sirainen <tss@iki.fi>
date Fri, 23 Jul 2004 19:28:23 +0300
parents 849f12c9c7d0
children e6b216ab4b4f
files src/lib-index/mail-cache-transaction.c
diffstat 1 files changed, 17 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-index/mail-cache-transaction.c	Fri Jul 23 06:23:18 2004 +0300
+++ b/src/lib-index/mail-cache-transaction.c	Fri Jul 23 19:28:23 2004 +0300
@@ -29,6 +29,9 @@
 
 static const unsigned char *null4[] = { 0, 0, 0, 0 };
 
+static int mail_cache_link_unlocked(struct mail_cache *cache,
+				    uint32_t old_offset, uint32_t new_offset);
+
 struct mail_cache_transaction_ctx *
 mail_cache_get_transaction(struct mail_cache_view *view,
 			   struct mail_index_transaction *t)
@@ -385,8 +388,8 @@
 				   only the new one will be written to
 				   transaction log, we need to do the linking
 				   ourself here. */
-				if (mail_cache_link(cache, old_offset,
-						    write_offset) < 0)
+				if (mail_cache_link_unlocked(cache, old_offset,
+							     write_offset) < 0)
 					return -1;
 			}
 
@@ -621,6 +624,17 @@
 	return mail_index_update_cache_lookup(ctx->trans, seq, offset_r);
 }
 
+static int mail_cache_link_unlocked(struct mail_cache *cache,
+				    uint32_t old_offset, uint32_t new_offset)
+{
+	new_offset += offsetof(struct mail_cache_record, prev_offset);
+	if (pwrite_full(cache->fd, &old_offset,
+			sizeof(old_offset), new_offset) < 0) {
+		mail_cache_set_syscall_error(cache, "pwrite_full()");
+		return -1;
+	}
+	return 0;
+}
 
 int mail_cache_link(struct mail_cache *cache, uint32_t old_offset,
 		    uint32_t new_offset)
@@ -635,12 +649,8 @@
 		return -1;
 	}
 
-	new_offset += offsetof(struct mail_cache_record, prev_offset);
-	if (pwrite_full(cache->fd, &old_offset,
-			sizeof(old_offset), new_offset) < 0) {
-		mail_cache_set_syscall_error(cache, "pwrite_full()");
+	if (mail_cache_link_unlocked(cache, old_offset, new_offset) < 0)
 		return -1;
-	}
 
 	cache->hdr_copy.continued_record_count++;
 	cache->hdr_modified = TRUE;