]> granicus.if.org Git - vim/commitdiff
patch 8.0.0948: crash if timer closes window while dragging status line v8.0.0948
authorBram Moolenaar <Bram@vim.org>
Wed, 16 Aug 2017 20:46:01 +0000 (22:46 +0200)
committerBram Moolenaar <Bram@vim.org>
Wed, 16 Aug 2017 20:46:01 +0000 (22:46 +0200)
Problem:    Crash if timer closes window while dragging status line.
Solution:   Check if the window still exists. (Yasuhiro Matsumoto, closes
            #1979)

src/edit.c
src/evalfunc.c
src/gui.c
src/normal.c
src/ui.c
src/version.c

index e08370863c30bab861fcce09fdc96e6ac03d7296..3a9b3aaf9f09d4ad0ceced577165c35e63011f30 100644 (file)
@@ -9418,7 +9418,7 @@ ins_mousescroll(int dir)
 {
     pos_T      tpos;
 # if defined(FEAT_WINDOWS)
-    win_T      *old_curwin = curwin;
+    win_T      *old_curwin = curwin, *wp;
 # endif
 # ifdef FEAT_INS_EXPAND
     int                did_scroll = FALSE;
@@ -9435,7 +9435,10 @@ ins_mousescroll(int dir)
        col = mouse_col;
 
        /* find the window at the pointer coordinates */
-       curwin = mouse_find_win(&row, &col);
+       wp = mouse_find_win(&row, &col);
+       if (wp == NULL)
+           return;
+       curwin = wp;
        curbuf = curwin->w_buffer;
     }
     if (curwin == old_curwin)
index 2be7fe1bf2e6b6feb3f0f8a8761847ea138a5aa5..452183594f2fc4b68d8e9932ed8f595c07a39044 100644 (file)
@@ -4382,6 +4382,8 @@ f_getchar(typval_T *argvars, typval_T *rettv)
                /* Find the window at the mouse coordinates and compute the
                 * text position. */
                win = mouse_find_win(&row, &col);
+               if (win == NULL)
+                   return;
                (void)mouse_comp_pos(win, &row, &col, &lnum);
 # ifdef FEAT_WINDOWS
                for (wp = firstwin; wp != win; wp = wp->w_next)
index 63625bfc406a92aa95c29801090c3ed4c33e30c7..f774750f2b89de28b7626fcf5668795df85af9af 100644 (file)
--- a/src/gui.c
+++ b/src/gui.c
@@ -4933,7 +4933,7 @@ gui_mouse_correct(void)
 }
 
 /*
- * Find window where the mouse pointer "y" coordinate is in.
+ * Find window where the mouse pointer "x" / "y" coordinate is in.
  */
     static win_T *
 xy2win(int x UNUSED, int y UNUSED)
@@ -4948,6 +4948,8 @@ xy2win(int x UNUSED, int y UNUSED)
     if (row < 0 || col < 0)            /* before first window */
        return NULL;
     wp = mouse_find_win(&row, &col);
+    if (wp == NULL)
+       return NULL;
 # ifdef FEAT_MOUSESHAPE
     if (State == HITRETURN || State == ASKMORE)
     {
index ea963667d48e7ab3a63941d1ea01abf306a9cb5d..c543635ef4e5f91dc93034ea2fd184202eef5e2d 100644 (file)
@@ -4627,7 +4627,7 @@ nv_screengo(oparg_T *oap, int dir, long dist)
 nv_mousescroll(cmdarg_T *cap)
 {
 # ifdef FEAT_WINDOWS
-    win_T *old_curwin = curwin;
+    win_T *old_curwin = curwin, *wp;
 
     if (mouse_row >= 0 && mouse_col >= 0)
     {
@@ -4637,7 +4637,10 @@ nv_mousescroll(cmdarg_T *cap)
        col = mouse_col;
 
        /* find the window at the pointer coordinates */
-       curwin = mouse_find_win(&row, &col);
+       wp = mouse_find_win(&row, &col);
+       if (wp == NULL)
+           return;
+       curwin = wp;
        curbuf = curwin->w_buffer;
     }
 # endif
index 907390e6b8c48bc68b878a04eff4ca68938c075a..ddae372664018f2847800f9347edea0371018854 100644 (file)
--- a/src/ui.c
+++ b/src/ui.c
@@ -2709,6 +2709,8 @@ retnomove:
 #ifdef FEAT_WINDOWS
        /* find the window where the row is in */
        wp = mouse_find_win(&row, &col);
+       if (wp == NULL)
+           return IN_UNKNOWN;
 #else
        wp = firstwin;
 #endif
@@ -3117,11 +3119,13 @@ mouse_comp_pos(
 /*
  * Find the window at screen position "*rowp" and "*colp".  The positions are
  * updated to become relative to the top-left of the window.
+ * Returns NULL when something is wrong.
  */
     win_T *
 mouse_find_win(int *rowp, int *colp UNUSED)
 {
     frame_T    *fp;
+    win_T      *wp;
 
     fp = topframe;
     *rowp -= firstwin->w_winrow;
@@ -3148,7 +3152,12 @@ mouse_find_win(int *rowp, int *colp UNUSED)
            }
        }
     }
-    return fp->fr_win;
+    /* When using a timer that closes a window the window might not actually
+     * exist. */
+    FOR_ALL_WINDOWS(wp)
+       if (wp == fp->fr_win)
+           return wp;
+    return NULL;
 }
 #endif
 
@@ -3171,6 +3180,8 @@ get_fpos_of_mouse(pos_T *mpos)
 #ifdef FEAT_WINDOWS
     /* find the window where the row is in */
     wp = mouse_find_win(&row, &col);
+    if (wp == NULL)
+       return IN_UNKNOWN;
 #else
     wp = firstwin;
 #endif
index ebfa0bf2e6dbdb572ebd427d33617a506c0f2c1b..b2de15d16901df46e2f11f6544847b2594ebbbb5 100644 (file)
@@ -769,6 +769,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    948,
 /**/
     947,
 /**/