]> granicus.if.org Git - vim/commitdiff
patch 8.2.1905: the wininfo list may contain stale entries v8.2.1905
authorBram Moolenaar <Bram@vim.org>
Sun, 25 Oct 2020 16:55:09 +0000 (17:55 +0100)
committerBram Moolenaar <Bram@vim.org>
Sun, 25 Oct 2020 16:55:09 +0000 (17:55 +0100)
Problem:    The wininfo list may contain stale entries.
Solution:   When closing a window remove any other entry where the window
            pointer is NULL.

src/buffer.c
src/proto/buffer.pro
src/version.c
src/window.c

index 318ce7f9885f80645ac106c3c71ad7776b4702e2..5a5eb9f416d2ed087aea7f2ab615bc435c3e1adb 100644 (file)
@@ -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".
  */
@@ -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);
     }
 }
 
index 3a632993646db44baf7be17362b907ba5459dc6a..4d890ce45cb79b255fdd6c63453fe5eb8d0ae2d7 100644 (file)
@@ -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);
index 2d36060236971ec767670b6062c62faf05195633..1cde8c724565b5e9acb00d11eaf61db05ab61eae 100644 (file)
@@ -750,6 +750,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1905,
 /**/
     1904,
 /**/
index 243bd32998ca9ca5552b2aabcc619bdf88e47610..9dbfae210d49f6b708a9942032aed1da8ce626a0 100644 (file)
@@ -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);