Skip to content

Commit

Permalink
patch 8.2.1905: the wininfo list may contain stale entries
Browse files Browse the repository at this point in the history
Problem:    The wininfo list may contain stale entries.
Solution:   When closing a window remove any other entry where the window
            pointer is NULL.
  • Loading branch information
brammool committed Oct 25, 2020
1 parent 89b693e commit 4882d98
Show file tree
Hide file tree
Showing 4 changed files with 39 additions and 8 deletions.
25 changes: 17 additions & 8 deletions src/buffer.c
Original file line number Diff line number Diff line change
Expand Up @@ -1005,6 +1005,22 @@ free_buffer_stuff(
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".
*/
Expand All @@ -1017,14 +1033,7 @@ clear_wininfo(buf_T *buf)
{
wip = buf->b_wininfo;
buf->b_wininfo = wip->wi_next;
if (wip->wi_optset)
{
clear_winopt(&wip->wi_opt);
#ifdef FEAT_FOLDING
deleteFoldRecurse(&wip->wi_folds);
#endif
}
vim_free(wip);
free_wininfo(wip);
}
}

Expand Down
1 change: 1 addition & 0 deletions src/proto/buffer.pro
Original file line number Diff line number Diff line change
Expand Up @@ -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 buf_clear_file(buf_T *buf);
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 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);
Expand Down
2 changes: 2 additions & 0 deletions src/version.c
Original file line number Diff line number Diff line change
Expand Up @@ -750,6 +750,8 @@ static char *(features[]) =

static int included_patches[] =
{ /* Add new patch number below this line */
/**/
1905,
/**/
1904,
/**/
Expand Down
19 changes: 19 additions & 0 deletions src/window.c
Original file line number Diff line number Diff line change
Expand Up @@ -5015,7 +5015,26 @@ win_free(
FOR_ALL_BUFFERS(buf)
FOR_ALL_BUF_WININFO(buf, wip)
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;
}

#ifdef FEAT_SEARCH_EXTRA
clear_matches(wp);
Expand Down

0 comments on commit 4882d98

Please sign in to comment.