From: Timo Sirainen Date: Wed, 23 Dec 2009 18:03:56 +0000 (-0500) Subject: maildir: Fixed potential assert-crashes with "Duplicate file entry" handling. X-Git-Tag: 2.0.beta2~90 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=0dab9ad19ae7b1e3afe74d3ace2882fabb264a41;p=thirdparty%2Fdovecot%2Fcore.git maildir: Fixed potential assert-crashes with "Duplicate file entry" handling. --HG-- branch : HEAD --- diff --git a/src/lib-storage/index/maildir/maildir-uidlist.c b/src/lib-storage/index/maildir/maildir-uidlist.c index 7520c7c147..6d0faef97a 100644 --- a/src/lib-storage/index/maildir/maildir-uidlist.c +++ b/src/lib-storage/index/maildir/maildir-uidlist.c @@ -400,13 +400,20 @@ maildir_uidlist_records_array_delete(struct maildir_uidlist *uidlist, struct maildir_uidlist_rec *rec) { struct maildir_uidlist_rec *const *recs, *const *pos; - unsigned int idx; - - pos = array_bsearch(&uidlist->records, &rec, maildir_uid_cmp); - i_assert(pos != NULL); + unsigned int idx, count; - recs = array_idx(&uidlist->records, 0); - idx = pos - recs; + recs = array_get(&uidlist->records, &count); + if (!uidlist->unsorted) { + pos = array_bsearch(&uidlist->records, &rec, maildir_uid_cmp); + i_assert(pos != NULL); + idx = pos - recs; + } else { + for (idx = 0; idx < count; idx++) { + if (recs[idx]->uid == rec->uid) + break; + } + i_assert(idx != count); + } array_delete(&uidlist->records, idx, 1); return idx; }