changeset 19291:1d6bc6b31c2e v8.2.0204

patch 8.2.0204: crash when using winnr('j') in a popup window Commit: https://github.com/vim/vim/commit/631ebc48149a0446dd9ffbddd3e2822252085885 Author: Bram Moolenaar <Bram@vim.org> Date: Mon Feb 3 22:15:26 2020 +0100 patch 8.2.0204: crash when using winnr('j') in a popup window Problem: Crash when using winnr('j') in a popup window. Solution: Do not search for neighbors in a popup window. (closes https://github.com/vim/vim/issues/5568)
author Bram Moolenaar <Bram@vim.org>
date Mon, 03 Feb 2020 22:30:03 +0100
parents 144353345c9b
children eb662829cb7d
files src/evalwindow.c src/testdir/test_popupwin.vim src/version.c src/window.c
diffstat 4 files changed, 20 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/src/evalwindow.c
+++ b/src/evalwindow.c
@@ -332,8 +332,6 @@ get_winnr(tabpage_T *tp, typval_T *argva
 	else if (STRCMP(arg, "#") == 0)
 	{
 	    twin = (tp == curtab) ? prevwin : tp->tp_prevwin;
-	    if (twin == NULL)
-		nr = 0;
 	}
 	else
 	{
@@ -360,6 +358,8 @@ get_winnr(tabpage_T *tp, typval_T *argva
 	    else
 		invalid_arg = TRUE;
 	}
+	if (twin == NULL)
+	    nr = 0;
 
 	if (invalid_arg)
 	{
--- a/src/testdir/test_popupwin.vim
+++ b/src/testdir/test_popupwin.vim
@@ -2400,9 +2400,14 @@ func Test_popupwin_terminal_buffer()
 
   let origwin = win_getid()
   let ptybuf = term_start(&shell, #{hidden: 1})
-  let winnr = popup_create(ptybuf, #{minwidth: 40, minheight: 10})
+  let winid = popup_create(ptybuf, #{minwidth: 40, minheight: 10})
   " Wait for shell to start
   sleep 200m
+  " Check this doesn't crash
+  call assert_equal(winnr(), winnr('j'))
+  call assert_equal(winnr(), winnr('k'))
+  call assert_equal(winnr(), winnr('h'))
+  call assert_equal(winnr(), winnr('l'))
   " Cannot quit while job is running
   call assert_fails('call feedkeys("\<C-W>:quit\<CR>", "xt")', 'E948:')
   call feedkeys("exit\<CR>", 'xt')
--- a/src/version.c
+++ b/src/version.c
@@ -743,6 +743,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    204,
+/**/
     203,
 /**/
     202,
--- a/src/window.c
+++ b/src/window.c
@@ -4431,6 +4431,11 @@ win_vert_neighbor(tabpage_T *tp, win_T *
     frame_T	*nfr;
     frame_T	*foundfr;
 
+#ifdef FEAT_PROP_POPUP
+    if (popup_is_popup(wp))
+	// popups don't have neighbors.
+	return NULL;
+#endif
     foundfr = wp->w_frame;
     while (count--)
     {
@@ -4513,6 +4518,11 @@ win_horz_neighbor(tabpage_T *tp, win_T *
     frame_T	*nfr;
     frame_T	*foundfr;
 
+#ifdef FEAT_PROP_POPUP
+    if (popup_is_popup(wp))
+	// popups don't have neighbors.
+	return NULL;
+#endif
     foundfr = wp->w_frame;
     while (count--)
     {