diff options
author | Bram Moolenaar <Bram@vim.org> | 2019-12-11 19:34:54 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2019-12-11 19:34:54 +0100 |
commit | 4954019c93a2bb5a0b1af54b5961c933beeb56f4 (patch) | |
tree | ca396e8fbc00a7f8934013fba5601ad1206903bc | |
parent | 0efd1bdcf4891f9ef2537e4c3d50a379186dca5f (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)
-rw-r--r-- | src/popupwin.c | 12 | ||||
-rw-r--r-- | src/testdir/test_popupwin.vim | 4 | ||||
-rw-r--r-- | src/version.c | 2 |
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, |