vim-patch:7.4.2023

Problem:  buflist_findname_stat() may find a dummy buffer.
Solution: Set the BF_DUMMY flag after loading a dummy buffer. Start
          finding buffers from the end of the list.

NOTE: In Neovim, buflist_findname_stat() was replaced by
buflist_findname_file_id() in c41535d69.

ea3f2e7be4
This commit is contained in:
Marco Hinz 2017-01-09 12:53:06 +01:00 committed by James McCoy
parent d60d1b3232
commit e3b92c77da
No known key found for this signature in database
GPG Key ID: DFE691AE331BA3DB
4 changed files with 17 additions and 8 deletions

View File

@ -1849,7 +1849,8 @@ buf_T *buflist_findname(char_u *ffname)
static buf_T *buflist_findname_file_id(char_u *ffname, FileID *file_id,
bool file_id_valid)
{
FOR_ALL_BUFFERS(buf) {
// Start at the last buffer, expect to find a match sooner.
FOR_ALL_BUFFERS_BACKWARDS(buf) {
if ((buf->b_flags & BF_DUMMY) == 0
&& !otherfile_buf(buf, ffname, file_id, file_id_valid)) {
return buf;
@ -1923,7 +1924,7 @@ int buflist_findpat(
return -1;
}
FOR_ALL_BUFFERS(buf) {
FOR_ALL_BUFFERS_BACKWARDS(buf) {
if (buf->b_p_bl == find_listed
&& (!diffmode || diff_mode_buf(buf))
&& buflist_match(&regmatch, buf, false) != NULL) {

View File

@ -602,7 +602,10 @@ EXTERN buf_T *lastbuf INIT(= NULL); // last buffer
EXTERN buf_T *curbuf INIT(= NULL); // currently active buffer
// Iterates over all buffers in the buffer list.
# define FOR_ALL_BUFFERS(buf) for (buf_T *buf = firstbuf; buf != NULL; buf = buf->b_next)
#define FOR_ALL_BUFFERS(buf) \
for (buf_T *buf = firstbuf; buf != NULL; buf = buf->b_next)
#define FOR_ALL_BUFFERS_BACKWARDS(buf) \
for (buf_T *buf = lastbuf; buf != NULL; buf = buf->b_prev)
/* Flag that is set when switching off 'swapfile'. It means that all blocks
* are to be loaded into memory. Shouldn't be global... */

View File

@ -3778,10 +3778,15 @@ load_dummy_buffer (
}
}
/* restore curwin/curbuf and a few other things */
// Restore curwin/curbuf and a few other things.
aucmd_restbuf(&aco);
if (newbuf_to_wipe != NULL && buf_valid(newbuf_to_wipe))
wipe_buffer(newbuf_to_wipe, FALSE);
if (newbuf_to_wipe != NULL && buf_valid(newbuf_to_wipe)) {
wipe_buffer(newbuf_to_wipe, false);
}
// Add back the "dummy" flag, otherwise buflist_findname_file_id()
// won't skip it.
newbuf->b_flags |= BF_DUMMY;
}
/*

View File

@ -416,8 +416,8 @@ static int included_patches[] = {
// 2027 NA
// 2026 NA
// 2025 NA
// 2024,
// 2023,
2024,
2023,
2022,
2021,
// 2020 NA