diff options
author | zeertzjq <zeertzjq@outlook.com> | 2022-10-05 21:27:58 +0800 |
---|---|---|
committer | zeertzjq <zeertzjq@outlook.com> | 2022-10-05 22:40:28 +0800 |
commit | dcdb7dca6aa7e335b2e8f339d3bb76da1c9d3b6e (patch) | |
tree | 6f1dc59050bceb54a934122cfc0f6f6938b88e96 | |
parent | a66b12378b1431f886c9b4235160abb171bcb05a (diff) | |
download | rneovim-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.c | 4 | ||||
-rw-r--r-- | src/nvim/testdir/test_arglist.vim | 7 |
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 |