1
0
forked from aniani/vim

patch 8.1.2420: crash when calling popup_close() in win_execute()

Problem:    Crash when calling popup_close() in win_execute().
Solution:   Disallow popup_close() in popup window. (Yasuhiro Matsumoto,
            closes #5345)
This commit is contained in:
Bram Moolenaar
2019-12-11 19:34:54 +01:00
parent 0efd1bdcf4
commit 4954019c93
3 changed files with 16 additions and 2 deletions

View File

@@ -1753,7 +1753,7 @@ popup_create(typval_T *argvars, typval_T *rettv, create_type_T type)
// Check that arguments look OK. // Check that arguments look OK.
if (argvars[0].v_type == VAR_NUMBER) 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) if (buf == NULL)
{ {
semsg(_(e_nobufnr), argvars[0].vval.v_number); 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; 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) if (wp->w_close_cb.cb_name != NULL)
// Careful: This may make "wp" invalid. // Careful: This may make "wp" invalid.
invoke_popup_callback(wp, arg); invoke_popup_callback(wp, arg);
@@ -2331,8 +2335,12 @@ find_popup_win(int id)
f_popup_close(typval_T *argvars, typval_T *rettv UNUSED) f_popup_close(typval_T *argvars, typval_T *rettv UNUSED)
{ {
int id = (int)tv_get_number(argvars); 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) if (wp != NULL)
popup_close_and_callback(wp, &argvars[1]); popup_close_and_callback(wp, &argvars[1]);
} }

View File

@@ -891,6 +891,10 @@ func Test_win_execute_closing_curwin()
let winid = popup_create('some text', {}) let winid = popup_create('some text', {})
call assert_fails('call win_execute(winid, winnr() .. "close")', 'E994') call assert_fails('call win_execute(winid, winnr() .. "close")', 'E994')
call popup_clear() 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 endfunc
func Test_win_execute_not_allowed() func Test_win_execute_not_allowed()

View File

@@ -742,6 +742,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
2420,
/**/ /**/
2419, 2419,
/**/ /**/