# HG changeset patch # User Timo Sirainen # Date 1090600103 -10800 # Node ID 1556d9ba23dc8cbabb51166d2171af0e3901e015 # Parent 849f12c9c7d078603cc612684d3ecab4b413f1f3 Assert crashfix in certain situations when adding new cache records. diff -r 849f12c9c7d0 -r 1556d9ba23dc src/lib-index/mail-cache-transaction.c --- 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;