aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorzeertzjq <zeertzjq@outlook.com>2022-07-26 20:03:02 +0800
committerGitHub <noreply@github.com>2022-07-26 20:03:02 +0800
commit1a4753f25a0efe6f79aed6d3bf10d4459ae302bd (patch)
treed6f671e448c6d542fe74b158b48112b6c85c42cb /src
parentcbfae548e8944801e766f42d966b38491afa8587 (diff)
parent27116a015981926f9f7a7600fe8cb7b849290082 (diff)
downloadrneovim-1a4753f25a0efe6f79aed6d3bf10d4459ae302bd.tar.gz
rneovim-1a4753f25a0efe6f79aed6d3bf10d4459ae302bd.tar.bz2
rneovim-1a4753f25a0efe6f79aed6d3bf10d4459ae302bd.zip
Merge pull request #19514 from zeertzjq/vim-8.1.1424
vim-patch:8.1.1424,9.0.0076: crash when popup menu is deleted while waiting for char
Diffstat (limited to 'src')
-rw-r--r--src/nvim/popupmnu.c5
-rw-r--r--src/nvim/testdir/test_popup.vim19
2 files changed, 23 insertions, 1 deletions
diff --git a/src/nvim/popupmnu.c b/src/nvim/popupmnu.c
index 5b1b80935e..746429e5d5 100644
--- a/src/nvim/popupmnu.c
+++ b/src/nvim/popupmnu.c
@@ -1054,7 +1054,10 @@ void pum_show_popupmenu(vimmenu_T *menu)
ui_flush();
int c = vgetc();
- if (c == ESC || c == Ctrl_C) {
+
+ // Bail out when typing Esc, CTRL-C or some callback or <expr> mapping
+ // closed the popup menu.
+ if (c == ESC || c == Ctrl_C || pum_array == NULL) {
break;
} else if (c == CAR || c == NL) {
// enter: select current item, if any, and close
diff --git a/src/nvim/testdir/test_popup.vim b/src/nvim/testdir/test_popup.vim
index a5e4be49f4..0486ed83ad 100644
--- a/src/nvim/testdir/test_popup.vim
+++ b/src/nvim/testdir/test_popup.vim
@@ -955,6 +955,25 @@ func Test_menu_only_exists_in_terminal()
endtry
endfunc
+" This used to crash before patch 8.1.1424
+func Test_popup_delete_when_shown()
+ CheckFeature menu
+ CheckNotGui
+
+ func Func()
+ popup Foo
+ return "\<Ignore>"
+ endfunc
+
+ nmenu Foo.Bar :
+ nnoremap <expr> <F2> Func()
+ call feedkeys("\<F2>\<F2>\<Esc>", 'xt')
+
+ delfunc Func
+ nunmenu Foo.Bar
+ nunmap <F2>
+endfunc
+
func Test_popup_complete_info_01()
new
inoremap <buffer><F5> <C-R>=complete_info().mode<CR>