From: Timo Sirainen Date: Tue, 24 Mar 2009 00:10:55 +0000 (-0400) Subject: mail_index_atomic_inc_ext() didn't handle multiple increments within a transaction. X-Git-Tag: 2.0.alpha1~1038^2~19 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=5c42ea4a70cf5c6df179f22af2a44b214df0a873;p=thirdparty%2Fdovecot%2Fcore.git mail_index_atomic_inc_ext() didn't handle multiple increments within a transaction. --HG-- branch : HEAD --- 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 *