[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