]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-index: Assert in mail_index_append_finish_uids() to prevent UID wrapping
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Thu, 30 Mar 2017 20:25:40 +0000 (23:25 +0300)
committerGitLab <gitlab@git.dovecot.net>
Fri, 31 Mar 2017 12:41:03 +0000 (15:41 +0300)
This should be handled better eventually, but it's better to crash earlier
now than later. This avoids a later assert:

Panic: file mail-index-transaction-finish.c: line 187 (mail_index_transaction_get_uid): assertion failed: (rec->uid != 0)

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

index 692fbf1f6fe33972b989d1a1bab94d1f6d8671c7..9fbeca447502e90862c2960086d1710f5a30dc84 100644 (file)
@@ -205,6 +205,8 @@ void mail_index_append_finish_uids(struct mail_index_transaction *t,
        if (!array_is_created(&t->appends))
                return;
 
+       i_assert(first_uid < (uint32_t)-1);
+
        /* first find the highest assigned uid */
        recs = array_get_modifiable(&t->appends, &count);
        i_assert(count > 0);
@@ -214,12 +216,14 @@ void mail_index_append_finish_uids(struct mail_index_transaction *t,
                if (next_uid <= recs[i].uid)
                        next_uid = recs[i].uid + 1;
        }
+       i_assert(next_uid > 0 && next_uid < (uint32_t)-1);
 
        /* assign missing uids */
        for (i = 0; i < count; i++) {
-               if (recs[i].uid == 0 || recs[i].uid < first_uid)
+               if (recs[i].uid == 0 || recs[i].uid < first_uid) {
+                       i_assert(next_uid < (uint32_t)-1);
                        recs[i].uid = next_uid++;
-               else {
+               else {
                        if (next_uid != first_uid)
                                t->appends_nonsorted = TRUE;
                }