changeset 12136:60cf03e59402 v8.0.0948

patch 8.0.0948: crash if timer closes window while dragging status line commit https://github.com/vim/vim/commit/989a70c590c2bd109eb362d3a0e48cb1427ae13d Author: Bram Moolenaar <Bram@vim.org> Date: Wed Aug 16 22:46:01 2017 +0200 patch 8.0.0948: crash if timer closes window while dragging status line Problem: Crash if timer closes window while dragging status line. Solution: Check if the window still exists. (Yasuhiro Matsumoto, closes #1979)
author Christian Brabandt <cb@256bit.org>
date Wed, 16 Aug 2017 23:00:05 +0200
parents a4f1b795227c
children 7b1eedab0ff1
files src/edit.c src/evalfunc.c src/gui.c src/normal.c src/ui.c src/version.c
diffstat 6 files changed, 29 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/src/edit.c
+++ b/src/edit.c
@@ -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)
--- a/src/evalfunc.c
+++ b/src/evalfunc.c
@@ -4382,6 +4382,8 @@ f_getchar(typval_T *argvars, typval_T *r
 		/* 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)
--- 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)
     {
--- a/src/normal.c
+++ b/src/normal.c
@@ -4627,7 +4627,7 @@ nv_screengo(oparg_T *oap, int dir, long 
 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
--- 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 UNUS
 	    }
 	}
     }
-    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
--- a/src/version.c
+++ b/src/version.c
@@ -770,6 +770,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    948,
+/**/
     947,
 /**/
     946,