aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Edmund Lazo <jan.lazo@mail.utoronto.ca>2021-07-04 09:18:19 -0400
committerJan Edmund Lazo <jan.lazo@mail.utoronto.ca>2021-07-04 09:22:50 -0400
commit0d75b0d8d470fdf763743823feb6d9013eff069c (patch)
tree627a666e896a110455623114846c78875852853b
parentce4d424bfc92d7308d1edecd723d2f20cef6c2c0 (diff)
downloadrneovim-0d75b0d8d470fdf763743823feb6d9013eff069c.tar.gz
rneovim-0d75b0d8d470fdf763743823feb6d9013eff069c.tar.bz2
rneovim-0d75b0d8d470fdf763743823feb6d9013eff069c.zip
vim-patch:8.2.3097: crash when using "quit" at recovery prompt
Problem: Crash when using "quit" at recovery prompt and autocommands are triggered. Solution: Block autocommands when creating an empty buffer to use as the current buffer. (closes vim/vim#8506) https://github.com/vim/vim/commit/1d97efce0ce31ddf0dd4c1ae2228ef4caee6880c
-rw-r--r--src/nvim/buffer.c3
-rw-r--r--src/nvim/testdir/test_swap.vim12
2 files changed, 15 insertions, 0 deletions
diff --git a/src/nvim/buffer.c b/src/nvim/buffer.c
index f1f32076bf..8decd02b3a 100644
--- a/src/nvim/buffer.c
+++ b/src/nvim/buffer.c
@@ -901,7 +901,10 @@ void handle_swap_exists(bufref_T *old_curbuf)
if (old_curbuf == NULL
|| !bufref_valid(old_curbuf)
|| old_curbuf->br_buf == curbuf) {
+ // Block autocommands here because curwin->w_buffer is NULL.
+ block_autocmds();
buf = buflist_new(NULL, NULL, 1L, BLN_CURBUF | BLN_LISTED);
+ unblock_autocmds();
} else {
buf = old_curbuf->br_buf;
}
diff --git a/src/nvim/testdir/test_swap.vim b/src/nvim/testdir/test_swap.vim
index f27920d20f..3c191cd7c7 100644
--- a/src/nvim/testdir/test_swap.vim
+++ b/src/nvim/testdir/test_swap.vim
@@ -319,6 +319,7 @@ func Test_swap_prompt_splitwin()
let buf = RunVimInTerminal('', {'rows': 20})
call term_sendkeys(buf, ":set nomore\n")
call term_sendkeys(buf, ":set noruler\n")
+
call term_sendkeys(buf, ":split Xfile1\n")
call term_wait(buf)
call WaitForAssert({-> assert_match('^\[O\]pen Read-Only, (E)dit anyway, (R)ecover, (Q)uit, (A)bort: $', term_getline(buf, 20))})
@@ -330,8 +331,19 @@ func Test_swap_prompt_splitwin()
call term_wait(buf)
call WaitForAssert({-> assert_match('^1$', term_getline(buf, 20))})
call StopVimInTerminal(buf)
+
+ " This caused Vim to crash when typing "q".
+ " TODO: it does not actually reproduce the crash.
+ call writefile(['au BufAdd * set virtualedit=all'], 'Xvimrc')
+
+ let buf = RunVimInTerminal('-u Xvimrc Xfile1', {'rows': 20, 'wait_for_ruler': 0})
+ call TermWait(buf)
+ call WaitForAssert({-> assert_match('^\[O\]pen Read-Only, (E)dit anyway, (R)ecover, (Q)uit, (A)bort:', term_getline(buf, 20))})
+ call term_sendkeys(buf, "q")
+
%bwipe!
call delete('Xfile1')
+ call delete('Xvimrc')
endfunc
func Test_swap_symlink()