]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
mail_index_atomic_inc_ext() didn't handle multiple increments within a transaction.
authorTimo Sirainen <tss@iki.fi>
Tue, 24 Mar 2009 00:10:55 +0000 (20:10 -0400)
committerTimo Sirainen <tss@iki.fi>
Tue, 24 Mar 2009 00:10:55 +0000 (20:10 -0400)
--HG--
branch : HEAD

src/lib-index/mail-index-transaction.c

index b33a2d47cfe4495e37e1f9b909ea6ebde629cad0..14319b0e8c1d6863521e50ead1ec72d1ac81ae19 100644 (file)
@@ -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 *