aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorzeertzjq <zeertzjq@outlook.com>2022-10-05 21:27:58 +0800
committerzeertzjq <zeertzjq@outlook.com>2022-10-05 22:40:28 +0800
commitdcdb7dca6aa7e335b2e8f339d3bb76da1c9d3b6e (patch)
tree6f1dc59050bceb54a934122cfc0f6f6938b88e96
parenta66b12378b1431f886c9b4235160abb171bcb05a (diff)
downloadrneovim-dcdb7dca6aa7e335b2e8f339d3bb76da1c9d3b6e.tar.gz
rneovim-dcdb7dca6aa7e335b2e8f339d3bb76da1c9d3b6e.tar.bz2
rneovim-dcdb7dca6aa7e335b2e8f339d3bb76da1c9d3b6e.zip
vim-patch:8.2.3884: crash when clearing the argument list while using it
Problem: Crash when clearing the argument list while using it. Solution: Lock the argument list for ":all". https://github.com/vim/vim/commit/6f98371532fcff911b462d51bc64f2ce8a6ae682
-rw-r--r--src/nvim/arglist.c4
-rw-r--r--src/nvim/testdir/test_arglist.vim7
2 files changed, 11 insertions, 0 deletions
diff --git a/src/nvim/arglist.c b/src/nvim/arglist.c
index 7019a6f461..cddd22b1bf 100644
--- a/src/nvim/arglist.c
+++ b/src/nvim/arglist.c
@@ -818,6 +818,7 @@ static void do_arg_all(int count, int forceit, int keep_tabs)
tabpage_T *old_curtab, *last_curtab;
win_T *new_curwin = NULL;
tabpage_T *new_curtab = NULL;
+ bool prev_arglist_locked = arglist_locked;
assert(firstwin != NULL); // satisfy coverity
@@ -839,6 +840,7 @@ static void do_arg_all(int count, int forceit, int keep_tabs)
// watch out for its size to be changed.
alist = curwin->w_alist;
alist->al_refcount++;
+ arglist_locked = true;
old_curwin = curwin;
old_curtab = curtab;
@@ -1034,8 +1036,10 @@ static void do_arg_all(int count, int forceit, int keep_tabs)
// Remove the "lock" on the argument list.
alist_unlink(alist);
+ arglist_locked = prev_arglist_locked;
autocmd_no_enter--;
+
// restore last referenced tabpage's curwin
if (last_curtab != new_curtab) {
if (valid_tabpage(last_curtab)) {
diff --git a/src/nvim/testdir/test_arglist.vim b/src/nvim/testdir/test_arglist.vim
index 19b64f996c..b1edb66a02 100644
--- a/src/nvim/testdir/test_arglist.vim
+++ b/src/nvim/testdir/test_arglist.vim
@@ -607,4 +607,11 @@ func Test_all_not_allowed_from_cmdwin()
au! BufEnter
endfunc
+func Test_clear_arglist_in_all()
+ n 0 00 000 0000 00000 000000
+ au! * 0 n 0
+ all
+ au! *
+endfunc
+
" vim: shiftwidth=2 sts=2 expandtab