]> granicus.if.org Git - neomutt/commitdiff
Turn IMAP_EXPUNGE_EXPECTED back off when syncing. (closes #3940).
authorKevin McCarthy <kevin@8t8.us>
Fri, 12 May 2017 16:15:00 +0000 (09:15 -0700)
committerKevin McCarthy <kevin@8t8.us>
Fri, 12 May 2017 16:15:00 +0000 (09:15 -0700)
imap_sync_mailbox() turned on IMAP_EXPUNGE_EXPECTED when issuing a
EXPUNGE command during a sync.  However, it forgot to turn it back off.

That meant that an unexpected EXPUNGE that occurred during a
mx_check_mailbox -> imap_check_mailbox() -> imap_cmd_finish() call was
not setting
  idata->check_status = IMAP_EXPUNGE_PENDING;
and so imap_check_mailbox() was not returning MUTT_REOPENED.

This meant that although the Context had been changed, the index did
not run update_index(), resulting in a possible segfault.

Thanks to Uroš Juvan for reporting the issue, and his invaluable
description of how to reproduce the problem.

imap/imap.c

index 275fbb3b21692c80b815544bc30104ec8b971c63..f45a516e3642a9a1c7f952fd778630983d5b7686 100644 (file)
@@ -1336,10 +1336,12 @@ int imap_sync_mailbox (CONTEXT* ctx, int expunge, int* index_hint)
     idata->reopen |= IMAP_EXPUNGE_EXPECTED;
     if (imap_exec (idata, "EXPUNGE", 0) != 0)
     {
+      idata->reopen &= ~IMAP_EXPUNGE_EXPECTED;
       imap_error (_("imap_sync_mailbox: EXPUNGE failed"), idata->buf);
       rc = -1;
       goto out;
     }
+    idata->reopen &= ~IMAP_EXPUNGE_EXPECTED;
   }
 
   if (expunge && ctx->closing)