]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
maildir: Fixed potential assert-crashes with "Duplicate file entry" handling.
authorTimo Sirainen <tss@iki.fi>
Wed, 23 Dec 2009 18:03:56 +0000 (13:03 -0500)
committerTimo Sirainen <tss@iki.fi>
Wed, 23 Dec 2009 18:03:56 +0000 (13:03 -0500)
--HG--
branch : HEAD

src/lib-storage/index/maildir/maildir-uidlist.c

index 7520c7c1471bc49c74ae3e39d02ad64cf2759431..6d0faef97aeaf35d743306f90e3ba2ef9f062cf0 100644 (file)
@@ -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;
 }