summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2017-08-16 22:46:01 +0200
committerBram Moolenaar <Bram@vim.org>2017-08-16 22:46:01 +0200
commit989a70c590c2bd109eb362d3a0e48cb1427ae13d (patch)
treee35f05c19c3589b00450a54c40d3d928b32b0500
parent6fe15bbc87cb996912fe3c2c4068e356071ac516 (diff)
patch 8.0.0948: crash if timer closes window while dragging status linev8.0.0948
Problem: Crash if timer closes window while dragging status line. Solution: Check if the window still exists. (Yasuhiro Matsumoto, closes #1979)
-rw-r--r--src/edit.c7
-rw-r--r--src/evalfunc.c2
-rw-r--r--src/gui.c4
-rw-r--r--src/normal.c7
-rw-r--r--src/ui.c13
-rw-r--r--src/version.c2
6 files changed, 29 insertions, 6 deletions
diff --git a/src/edit.c b/src/edit.c
index e08370863c..3a9b3aaf9f 100644
--- 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)
diff --git a/src/evalfunc.c b/src/evalfunc.c
index 2be7fe1bf2..452183594f 100644
--- a/src/evalfunc.c
+++ b/src/evalfunc.c
@@ -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)
diff --git a/src/gui.c b/src/gui.c
index 63625bfc40..f774750f2b 100644
--- 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)
{
diff --git a/src/normal.c b/src/normal.c
index ea963667d4..c543635ef4 100644
--- a/src/normal.c
+++ b/src/normal.c
@@ -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
diff --git a/src/ui.c b/src/ui.c
index 907390e6b8..ddae372664 100644
--- 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
diff --git a/src/version.c b/src/version.c
index ebfa0bf2e6..b2de15d169 100644
--- 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,