From 5c42ea4a70cf5c6df179f22af2a44b214df0a873 Mon Sep 17 00:00:00 2001 From: Timo Sirainen Date: Mon, 23 Mar 2009 20:10:55 -0400 Subject: [PATCH] mail_index_atomic_inc_ext() didn't handle multiple increments within a transaction. --HG-- branch : HEAD --- src/lib-index/mail-index-transaction.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/lib-index/mail-index-transaction.c b/src/lib-index/mail-index-transaction.c index b33a2d47cf..14319b0e8c 100644 --- a/src/lib-index/mail-index-transaction.c +++ b/src/lib-index/mail-index-transaction.c @@ -1359,7 +1359,7 @@ void mail_index_atomic_inc_ext(struct mail_index_transaction *t, uint32_t seq, uint32_t ext_id, int diff) { ARRAY_TYPE(seq_array) *array; - int32_t diff32 = diff; + int32_t old_diff32, diff32 = diff; i_assert(seq > 0 && (seq <= mail_index_view_get_messages_count(t->view) || @@ -1373,7 +1373,13 @@ void mail_index_atomic_inc_ext(struct mail_index_transaction *t, uint32_t seq, if (!array_is_created(&t->ext_rec_atomics)) i_array_init(&t->ext_rec_atomics, ext_id + 2); array = array_idx_modifiable(&t->ext_rec_atomics, ext_id); - mail_index_seq_array_add(array, seq, &diff32, sizeof(diff32), NULL); + if (mail_index_seq_array_add(array, seq, &diff32, sizeof(diff32), + &old_diff32)) { + /* already incremented this sequence in this transaction */ + diff32 += old_diff32; + mail_index_seq_array_add(array, seq, &diff32, sizeof(diff32), + NULL); + } } struct mail_keywords * -- 2.47.3