mirror of
https://github.com/vim/vim.git
synced 2025-09-24 03:44:06 -04:00
patch 8.2.1905: the wininfo list may contain stale entries
Problem: The wininfo list may contain stale entries. Solution: When closing a window remove any other entry where the window pointer is NULL.
This commit is contained in:
25
src/buffer.c
25
src/buffer.c
@@ -1005,6 +1005,22 @@ free_buffer_stuff(
|
|||||||
VIM_CLEAR(buf->b_start_fenc);
|
VIM_CLEAR(buf->b_start_fenc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Free one wininfo_T.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
free_wininfo(wininfo_T *wip)
|
||||||
|
{
|
||||||
|
if (wip->wi_optset)
|
||||||
|
{
|
||||||
|
clear_winopt(&wip->wi_opt);
|
||||||
|
#ifdef FEAT_FOLDING
|
||||||
|
deleteFoldRecurse(&wip->wi_folds);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
vim_free(wip);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Free the b_wininfo list for buffer "buf".
|
* Free the b_wininfo list for buffer "buf".
|
||||||
*/
|
*/
|
||||||
@@ -1017,14 +1033,7 @@ clear_wininfo(buf_T *buf)
|
|||||||
{
|
{
|
||||||
wip = buf->b_wininfo;
|
wip = buf->b_wininfo;
|
||||||
buf->b_wininfo = wip->wi_next;
|
buf->b_wininfo = wip->wi_next;
|
||||||
if (wip->wi_optset)
|
free_wininfo(wip);
|
||||||
{
|
|
||||||
clear_winopt(&wip->wi_opt);
|
|
||||||
#ifdef FEAT_FOLDING
|
|
||||||
deleteFoldRecurse(&wip->wi_folds);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
vim_free(wip);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -8,6 +8,7 @@ int buf_valid(buf_T *buf);
|
|||||||
void close_buffer(win_T *win, buf_T *buf, int action, int abort_if_last, int ignore_abort);
|
void close_buffer(win_T *win, buf_T *buf, int action, int abort_if_last, int ignore_abort);
|
||||||
void buf_clear_file(buf_T *buf);
|
void buf_clear_file(buf_T *buf);
|
||||||
void buf_freeall(buf_T *buf, int flags);
|
void buf_freeall(buf_T *buf, int flags);
|
||||||
|
void free_wininfo(wininfo_T *wip);
|
||||||
void goto_buffer(exarg_T *eap, int start, int dir, int count);
|
void goto_buffer(exarg_T *eap, int start, int dir, int count);
|
||||||
void handle_swap_exists(bufref_T *old_curbuf);
|
void handle_swap_exists(bufref_T *old_curbuf);
|
||||||
char *do_bufdel(int command, char_u *arg, int addr_count, int start_bnr, int end_bnr, int forceit);
|
char *do_bufdel(int command, char_u *arg, int addr_count, int start_bnr, int end_bnr, int forceit);
|
||||||
|
@@ -750,6 +750,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
1905,
|
||||||
/**/
|
/**/
|
||||||
1904,
|
1904,
|
||||||
/**/
|
/**/
|
||||||
|
19
src/window.c
19
src/window.c
@@ -5015,7 +5015,26 @@ win_free(
|
|||||||
FOR_ALL_BUFFERS(buf)
|
FOR_ALL_BUFFERS(buf)
|
||||||
FOR_ALL_BUF_WININFO(buf, wip)
|
FOR_ALL_BUF_WININFO(buf, wip)
|
||||||
if (wip->wi_win == wp)
|
if (wip->wi_win == wp)
|
||||||
|
{
|
||||||
|
wininfo_T *wip2;
|
||||||
|
|
||||||
|
// If there already is an entry with "wi_win" set to NULL it
|
||||||
|
// must be removed, it would never be used.
|
||||||
|
for (wip2 = buf->b_wininfo; wip2 != NULL; wip2 = wip2->wi_next)
|
||||||
|
if (wip2->wi_win == NULL)
|
||||||
|
{
|
||||||
|
if (wip2->wi_next != NULL)
|
||||||
|
wip2->wi_next->wi_prev = wip2->wi_prev;
|
||||||
|
if (wip2->wi_prev == NULL)
|
||||||
|
buf->b_wininfo = wip2->wi_next;
|
||||||
|
else
|
||||||
|
wip2->wi_prev->wi_next = wip2->wi_next;
|
||||||
|
free_wininfo(wip2);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
wip->wi_win = NULL;
|
wip->wi_win = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef FEAT_SEARCH_EXTRA
|
#ifdef FEAT_SEARCH_EXTRA
|
||||||
clear_matches(wp);
|
clear_matches(wp);
|
||||||
|
Reference in New Issue
Block a user