From: Timo Sirainen Date: Thu, 30 Mar 2017 20:25:40 +0000 (+0300) Subject: lib-index: Assert in mail_index_append_finish_uids() to prevent UID wrapping X-Git-Tag: 2.3.0.rc1~1819 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5930d3ff79f8af73abce293a93e20f3723479631;p=thirdparty%2Fdovecot%2Fcore.git lib-index: Assert in mail_index_append_finish_uids() to prevent UID wrapping 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) --- diff --git a/src/lib-index/mail-index-transaction-update.c b/src/lib-index/mail-index-transaction-update.c index 692fbf1f6f..9fbeca4475 100644 --- a/src/lib-index/mail-index-transaction-update.c +++ b/src/lib-index/mail-index-transaction-update.c @@ -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; }