]> granicus.if.org Git - vim/commitdiff
patch 8.1.1649: Illegal memory access when closing popup window v8.1.1649
authorBram Moolenaar <Bram@vim.org>
Sun, 7 Jul 2019 18:43:34 +0000 (20:43 +0200)
committerBram Moolenaar <Bram@vim.org>
Sun, 7 Jul 2019 18:43:34 +0000 (20:43 +0200)
Problem:    Illegal memory access when closing popup window.
Solution:   Get w_next before closing the window.

src/popupwin.c
src/version.c

index 401f1fbea9d62c5c031399d90a5447009bbf2ef5..32f486181e2c595aa18f0fafc962108c04e1c4b6 100644 (file)
@@ -1437,6 +1437,7 @@ check_mouse_moved(win_T *wp, win_T *mouse_wp)
 
        res.v_type = VAR_NUMBER;
        res.vval.v_number = -2;
+       // Careful: this makes "wp" invalid.
        popup_close_and_callback(wp, &res);
     }
 }
@@ -1447,7 +1448,7 @@ check_mouse_moved(win_T *wp, win_T *mouse_wp)
     void
 popup_handle_mouse_moved(void)
 {
-    win_T   *wp;
+    win_T   *wp, *nextwp;
     win_T   *mouse_wp;
     int            row = mouse_row;
     int            col = mouse_col;
@@ -1455,10 +1456,16 @@ popup_handle_mouse_moved(void)
     // find the window where the mouse is in
     mouse_wp = mouse_find_win(&row, &col, FIND_POPUP);
 
-    for (wp = first_popupwin; wp != NULL; wp = wp->w_next)
+    for (wp = first_popupwin; wp != NULL; wp = nextwp)
+    {
+       nextwp = wp->w_next;
        check_mouse_moved(wp, mouse_wp);
-    for (wp = curtab->tp_first_popupwin; wp != NULL; wp = wp->w_next)
+    }
+    for (wp = curtab->tp_first_popupwin; wp != NULL; wp = nextwp)
+    {
+       nextwp = wp->w_next;
        check_mouse_moved(wp, mouse_wp);
+    }
 }
 
 /*
index 4952b7088f4076d04af8185093bb3494983d939b..82f90932ca749cfd7a495d68f89f0422f610a0d8 100644 (file)
@@ -777,6 +777,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1649,
 /**/
     1648,
 /**/