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:
@@ -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]);
|
||||||
}
|
}
|
||||||
|
@@ -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()
|
||||||
|
@@ -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,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user