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
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, static buf_T *buflist_findname_file_id(char_u *ffname, FileID *file_id,
bool file_id_valid) 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 if ((buf->b_flags & BF_DUMMY) == 0
&& !otherfile_buf(buf, ffname, file_id, file_id_valid)) { && !otherfile_buf(buf, ffname, file_id, file_id_valid)) {
return buf; return buf;
@@ -1923,7 +1924,7 @@ int buflist_findpat(
return -1; return -1;
} }
FOR_ALL_BUFFERS(buf) { FOR_ALL_BUFFERS_BACKWARDS(buf) {
if (buf->b_p_bl == find_listed if (buf->b_p_bl == find_listed
&& (!diffmode || diff_mode_buf(buf)) && (!diffmode || diff_mode_buf(buf))
&& buflist_match(&regmatch, buf, false) != NULL) { && 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 EXTERN buf_T *curbuf INIT(= NULL); // currently active buffer
// Iterates over all buffers in the buffer list. // 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 /* Flag that is set when switching off 'swapfile'. It means that all blocks
* are to be loaded into memory. Shouldn't be global... */ * 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); aucmd_restbuf(&aco);
if (newbuf_to_wipe != NULL && buf_valid(newbuf_to_wipe)) if (newbuf_to_wipe != NULL && buf_valid(newbuf_to_wipe)) {
wipe_buffer(newbuf_to_wipe, FALSE); 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 // 2027 NA
// 2026 NA // 2026 NA
// 2025 NA // 2025 NA
// 2024, 2024,
// 2023, 2023,
2022, 2022,
2021, 2021,
// 2020 NA // 2020 NA