]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
mdbox: Fixed crash when saving POP3 UIDLs to a non-empty mailbox.
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Mon, 11 Jul 2016 08:55:34 +0000 (11:55 +0300)
committerTimo Sirainen <timo.sirainen@dovecot.fi>
Mon, 11 Jul 2016 14:38:58 +0000 (17:38 +0300)
Fixes assert:

Panic: file mdbox-save.c: line 337: unreached

src/lib-storage/index/dbox-multi/mdbox-save.c

index d9bdc022b6ac499ad0eec59d329615ff2759b7fa..e8f8f3264117f30c15b3a1e2ee1a3886cc746182 100644 (file)
@@ -328,12 +328,18 @@ int mdbox_transaction_save_commit_pre(struct mail_save_context *_ctx)
                                      &_t->changes->saved_uids);
 
        if (ctx->ctx.highest_pop3_uidl_seq != 0) {
+               const struct dbox_save_mail *mails;
                struct seq_range_iter iter;
+               unsigned int highest_pop3_uidl_idx;
                uint32_t uid;
 
+               mails = array_idx(&ctx->mails, 0);
+               highest_pop3_uidl_idx =
+                       ctx->ctx.highest_pop3_uidl_seq - mails[0].seq;
+               i_assert(mails[highest_pop3_uidl_idx].seq == ctx->ctx.highest_pop3_uidl_seq);
+
                seq_range_array_iter_init(&iter, &_t->changes->saved_uids);
-               if (!seq_range_array_iter_nth(&iter,
-                               ctx->ctx.highest_pop3_uidl_seq-1, &uid))
+               if (!seq_range_array_iter_nth(&iter, highest_pop3_uidl_idx, &uid))
                        i_unreached();
                index_pop3_uidl_set_max_uid(&ctx->mbox->box, ctx->ctx.trans, uid);
        }