[dovecot-cvs] dovecot/src/lib-index mail-cache-transaction.c, 1.17, 1.18

cras at dovecot.org cras at dovecot.org
Fri Jul 23 19:28:25 EEST 2004


Update of /home/cvs/dovecot/src/lib-index
In directory talvi:/tmp/cvs-serv10606/lib-index

Modified Files:
	mail-cache-transaction.c 
Log Message:
Assert crashfix in certain situations when adding new cache records.



Index: mail-cache-transaction.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-index/mail-cache-transaction.c,v
retrieving revision 1.17
retrieving revision 1.18
diff -u -d -r1.17 -r1.18
--- mail-cache-transaction.c	20 Jul 2004 17:06:25 -0000	1.17
+++ mail-cache-transaction.c	23 Jul 2004 16:28:23 -0000	1.18
@@ -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;



More information about the dovecot-cvs mailing list