]> granicus.if.org Git - neomutt/commitdiff
fix trash_append() 1630/head
authorRichard Russon <rich@flatcap.org>
Tue, 2 Apr 2019 12:50:16 +0000 (12:50 +0000)
committerRichard Russon <rich@flatcap.org>
Tue, 9 Apr 2019 13:16:04 +0000 (14:16 +0100)
Prevent a crash when reopening a Mailbox.

> How exactly do these changes prevent the crash from occurring?

It's all about how mx_mbox_open() handles flags.  These four examples
are where we have a Mailbox open in 'normal' mode and try to open it
again in 'append' mode.

'Append' mode only makes sense for 'mbox' and 'compress', but the flag
affects mx_mbox_open(). It causes the function to create a duplicate
Mailbox, which is then used and discarded. The original Mailbox is now
out of sync.

The workaround, simply hides the flag for mx_mbox_open(), but
temporarily sets the internal bool append. This means that we work with
one Mailbox.

mx.c

diff --git a/mx.c b/mx.c
index fac8b46497191d2ac4078fc4dd70cca8b446b3ef..220152a0c03b931c91f762e8d031d63980c0912d 100644 (file)
--- a/mx.c
+++ b/mx.c
@@ -491,9 +491,12 @@ static int trash_append(struct Mailbox *m)
 #endif
 
   struct Mailbox *m_trash = mx_path_resolve(C_Trash);
-  struct Context *ctx_trash = mx_mbox_open(m_trash, MUTT_APPEND);
+  struct Context *ctx_trash = mx_mbox_open(m_trash, MUTT_OPEN_NO_FLAGS);
   if (ctx_trash)
   {
+    bool old_append = m_trash->append;
+    m_trash->append = true;
+
     /* continue from initial scan above */
     for (int i = first_del; i < m->msg_count; i++)
     {
@@ -502,12 +505,14 @@ static int trash_append(struct Mailbox *m)
         if (mutt_append_message(ctx_trash->mailbox, m, m->emails[i],
                                 MUTT_CM_NO_FLAGS, CH_NO_FLAGS) == -1)
         {
+          m_trash->append = old_append;
           mx_mbox_close(&ctx_trash);
           return -1;
         }
       }
     }
 
+    m_trash->append = old_append;
     mx_mbox_close(&ctx_trash);
   }
   else