automatic post-release commit for mutt-1.13.4
Update UPDATING file 1.13.4.
Fix crash when syncing large IMAP mailboxes.
imap_sync_mailbox() and imap_exec_msgset() make a copy of the headers
before resorting them to generate a message-set, to avoid context
changes. I noticed the oddity in the past but didn't investigate
deeply enough at the time. :-/
The code in imap_sync_mailbox() was wrong for four reasons:
1) Because IMAP_REOPEN_ALLOW is set, sync_helper() can trigger
an imap_exec if the queue fills up, resulting in new messages
being downloaded or expunges being triggered.
2) The copy was only allocating msgcount headers, instead of hdrmax.
Downloading new messages could then attempt to append beyond the end
of the array if hdrmax > msgcount.
3) New messages or expunges would disappear when the copy was restored
4) The callers of mx_sync_mailbox() are prepared for context changes,
and will adjust the cursor properly to avoid jumps.
The same problems can occur in imap_exec_msgset() when reopen is set.
Not all of its callers enable reopen, or are prepared to deal with
context changes though, so the copy is needed when reopen is not set.
An alternative solution tried converting to call mutt_sort_headers()
when possible. However that solution turned out to visibly slow down
syncs due to the double sorting.
This commit instead turns off reopen for the duration of the msgset
While verifying all queued operations are flushed, I noticed the
initial "quick delete" in imap_sync_mailbox() did not seem to be
guaranteed to flush. Ensure the imap_exec() further below is
triggered if either the quick delete or sync_helper calls generate
changes. Change the quick delete to assign to "quickdel_rc" to make
it clear the flush below is for both.
Change the post sync/msgset check to look for both ((oldsort != Sort)
|| hdrs), just to make sure a memory leak doesn't occur.
Speed up thread sort when many long threads exist.
Merge request !75 reported a massive slowdown opening a mailbox with
many long threads: on the order of an hour.
This is because mutt_set_virtual() was iterating through the whole
thread for each message.
After taking a closer look at current Mutt behavior, it seems the
num_hidden count is only needed in the root thread. Quoting my
comment in the merge request:
The index-format expando %M only applies to root level headers, so
there are no issues there.
The only concern is the pattern ~v. Limiting always resets collapsed
and num_hidden, so there also can't be any issues there. Tagging and
other pattern operators only work on visible messages. So tagging
while threads are sorted will only tag the root messages of
However, if you sort by thread, collapse a thread, and then sort by
date, the collapsed and num_hidden fields are not reset for each
header. In theory this would allow us to tag ~v with date
ordering. However, in master the num_hidden is only set (by
mutt_set_virtual()) for visible messages with a virtual number.
So even in master, switching to date-order and tagging ~v will only
tag the root messages of each collapsed thread.
This commit removes the num_hidden setting in mutt_set_virtual(),
instead directly assigning that value in the roothdr during a collapse
A subsequent commit will fix the behavior of ~v, when switching
sorting from threaded to something else, by putting num_hidden in
every header in the thread. This is technically a change in behavior,
so I will make that commit in the master branch.
Thanks to Score_Under for the pull request and for testing my
Revert $ssl_force_tls to default unset.
In theory it's a good idea encourage SSL usage everywhere.
However ticket #210 showed that, in reality, that kind of change
breaks configs and so is still not a good idea.
$ssl_startls defaults set and will use STARTTLS if the server
Fix rendering of replacement_char when Charset_is_utf8
Use mutt_addwch instead of addch to draw the replacement_char in
pager.c. The line to draw the replacement char was
addch (replacement_char ())
However, if Charset_is_utf8 is true, replacement_char returns 0xfffd,
which is outside the range that addch can handle. Use mutt_addwch
instead so that the pager displays the replacement char properly.
automatic post-release commit for mutt-1.13.3
Update UPDATING file for 1.13.3 release.
Update copyrights to 2020.
Fix crash when polling a closed ssl connection.
Commit 8353407c enabled checking for buffered OpenSSL/GnuTLS data when
polling, but neglected to check if the connection was already closed.
This can be triggered during imap_logout() if the connection write of
"LOGOUT" fails and closes the connection, before the poll. It's a bit
tricky to trigger because imap_logout_all() checks for a closed
connection, so the failure needs to take place at that last write.
Thanks to Stefan Sperling for pointing out the problem, complete with
a backtrace and patch. (This commit takes a different approach for a
Turn off auto-clear outside of autocrypt initialization.
The auto-clearing code was added in commit 01bc088c, for autocrypt
initial prompting. It removed having to keep track of every place a
browser or other menu might be displayed and having to remember to
clear it out.
However, clearing when mutt exits is a change of behavior for those
who have turned off alternative screens.
automatic post-release commit for mutt-1.13.2
Revert "Fixes unchecked return from link() in dotlock.c"
This reverts commit 317b7f6b53d8a4272acf8ef1b56f3406e9bc2691.
automatic post-release commit for mutt-1.13.1
Update UPDATING file for 1.13.1 release.
Fix segv in IMAP postponed menu caused by reopen_allow.
imap_open_mailbox() leaves IMAP_REOPEN_ALLOW set for the connection.
I noticed this previously but didn't bother untangling the logic yet
because the index always calls mx_check_mailbox() right away, which
unsets the flag.
However, when debugging the segv for commit 51729d8d I realized the
postponed menu/context also suffers from the problem, leaving the menu
ripe for segvs due to unmanaged expunges.
I believe imap_read_headers() turns it off and back on to avoid
goofing up imap_cmd_finish() when a reopen *is* allowed.
The logic needs to be cleaned up and fixed. However for a stable
branch fix, I'm am taking a conservative approach and just calling
mx_check_mailbox() to turn it back off.
Fix imap postponed mailbox use-after-free error.
mutt_get_postponed() was calling mx_close_mailbox(), but not checking
the return value. Because the postponed context is an actual
read-write, selected mailbox in a new connection, a failed close left
a dangling pointer in connection->idata->ctx.
imap_keepalive() traversed the connection list, finding the Postponed
connection still there, and passed the dangling pointer to
Change an empty postponed mailbox to just call fastclose. Change the
other closes to retry on a postive return code "reopen" event and then
finally just call fastclose.
Outside the index and postponed menu, Mutt's code only uses append or
readonly temporary contexts. Those are guaranteed to call
mx_fastclose_mailbox() and return 0.
Rename sidebar mailbox shortcuts option and default off.
Rename to $sidebar_use_mailbox_shortcuts. The shortening wasn't that
much shorter and made the name confusing.
To prevent complaints in the future as others transition to 1.13,
Make shortpath/indent code guards explicit.
In actuality, the parent_depth and indent_width won't ever be
But the new code for unset $sidebar_relative_shortpath_indent makes
this much less obvious. Better to be explicit than have some small
future code change result in a bug.
Create $sidebar_relative_shortpath_indent, default unset.
When unset this option provides the pre-1.13.0 sidebar indentation and
Setting the option will enable the new (relative to previous entries)
indentation and shortening behavior.
Note the mailbox shortcuts are controlled by
$sidebar_use_mb_shortcuts, which defaults set.