summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2019-12-11 19:34:54 +0100
committerBram Moolenaar <Bram@vim.org>2019-12-11 19:34:54 +0100
commit4954019c93a2bb5a0b1af54b5961c933beeb56f4 (patch)
treeca396e8fbc00a7f8934013fba5601ad1206903bc /src
parent0efd1bdcf4891f9ef2537e4c3d50a379186dca5f (diff)
patch 8.1.2420: crash when calling popup_close() in win_execute()v8.1.2420
Problem: Crash when calling popup_close() in win_execute(). Solution: Disallow popup_close() in popup window. (Yasuhiro Matsumoto, closes #5345)
Diffstat (limited to 'src')
-rw-r--r--src/popupwin.c12
-rw-r--r--src/testdir/test_popupwin.vim4
-rw-r--r--src/version.c2
3 files changed, 16 insertions, 2 deletions
diff --git a/src/popupwin.c b/src/popupwin.c
index dc09ef3a57..e65b4bf440 100644
--- a/src/popupwin.c
+++ b/src/popupwin.c
@@ -1753,7 +1753,7 @@ popup_create(typval_T *argvars, typval_T *rettv, create_type_T type)
// Check that arguments look OK.
if (argvars[0].v_type == VAR_NUMBER)
{
- buf = buflist_findnr( argvars[0].vval.v_number);
+ buf = buflist_findnr(argvars[0].vval.v_number);
if (buf == NULL)
{
semsg(_(e_nobufnr), argvars[0].vval.v_number);
@@ -2097,6 +2097,10 @@ popup_close_and_callback(win_T *wp, typval_T *arg)
{
int id = wp->w_id;
+ // Just in case a check higher up is missing.
+ if (wp == curwin && ERROR_IF_POPUP_WINDOW)
+ return;
+
if (wp->w_close_cb.cb_name != NULL)
// Careful: This may make "wp" invalid.
invoke_popup_callback(wp, arg);
@@ -2331,8 +2335,12 @@ find_popup_win(int id)
f_popup_close(typval_T *argvars, typval_T *rettv UNUSED)
{
int id = (int)tv_get_number(argvars);
- win_T *wp = find_popup_win(id);
+ win_T *wp;
+
+ if (ERROR_IF_POPUP_WINDOW)
+ return;
+ wp = find_popup_win(id);
if (wp != NULL)
popup_close_and_callback(wp, &argvars[1]);
}
diff --git a/src/testdir/test_popupwin.vim b/src/testdir/test_popupwin.vim
index 5d7f46f9a3..d5ee7160a1 100644
--- a/src/testdir/test_popupwin.vim
+++ b/src/testdir/test_popupwin.vim
@@ -891,6 +891,10 @@ func Test_win_execute_closing_curwin()
let winid = popup_create('some text', {})
call assert_fails('call win_execute(winid, winnr() .. "close")', 'E994')
call popup_clear()
+
+ let winid = popup_create('some text', {})
+ call assert_fails('call win_execute(winid, printf("normal! :\<C-u>call popup_close(%d)\<CR>", winid))', 'E994')
+ call popup_clear()
endfunc
func Test_win_execute_not_allowed()
diff --git a/src/version.c b/src/version.c
index 2b992df949..7b36fe320f 100644
--- 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 */
/**/
+ 2420,
+/**/
2419,
/**/
2418,