aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorzeertzjq <zeertzjq@outlook.com>2022-11-15 07:58:22 +0800
committerGitHub <noreply@github.com>2022-11-15 07:58:22 +0800
commit74399738510cb880507cba14f71acc0a96e14327 (patch)
tree456f4d35f86870277fb6e4a67d482811fb58e349
parent2685d27cd65ea255f9bf1fce44a355e235016212 (diff)
downloadrneovim-74399738510cb880507cba14f71acc0a96e14327.tar.gz
rneovim-74399738510cb880507cba14f71acc0a96e14327.tar.bz2
rneovim-74399738510cb880507cba14f71acc0a96e14327.zip
vim-patch:9.0.0882: using freed memory after SpellFileMissing autocmd uses bwipe (#21060)
Problem: Using freed memory after SpellFileMissing autocmd uses bwipe. Solution: Bail out if the window no longer exists. https://github.com/vim/vim/commit/c3d27ada14acd02db357f2d16347acc22cb17e93 Co-authored-by: Bram Moolenaar <Bram@vim.org>
-rw-r--r--src/nvim/spell.c5
-rw-r--r--src/nvim/testdir/test_spell.vim13
2 files changed, 16 insertions, 2 deletions
diff --git a/src/nvim/spell.c b/src/nvim/spell.c
index b1daf4ed23..b9ea7557c4 100644
--- a/src/nvim/spell.c
+++ b/src/nvim/spell.c
@@ -110,6 +110,7 @@
#include "nvim/types.h" // for char_u
#include "nvim/undo.h" // for u_save_cursor
#include "nvim/vim.h" // for curwin, strlen, STRLCPY, STRNCMP
+#include "nvim/window.h" // for win_valid_any_tab
// Result values. Lower number is accepted over higher one.
enum {
@@ -1965,8 +1966,8 @@ char *did_set_spelllang(win_T *wp)
} else {
spell_load_lang((char_u *)lang);
// SpellFileMissing autocommands may do anything, including
- // destroying the buffer we are using...
- if (!bufref_valid(&bufref)) {
+ // destroying the buffer we are using or closing the window.
+ if (!bufref_valid(&bufref) || !win_valid_any_tab(wp)) {
ret_msg = N_("E797: SpellFileMissing autocommand deleted buffer");
goto theend;
}
diff --git a/src/nvim/testdir/test_spell.vim b/src/nvim/testdir/test_spell.vim
index ea18fc5194..a919156066 100644
--- a/src/nvim/testdir/test_spell.vim
+++ b/src/nvim/testdir/test_spell.vim
@@ -159,6 +159,19 @@ func Test_spell_file_missing()
%bwipe!
endfunc
+func Test_spell_file_missing_bwipe()
+ " this was using a window that was wiped out in a SpellFileMissing autocmd
+ set spelllang=xy
+ au SpellFileMissing * n0
+ set spell
+ au SpellFileMissing * bw
+ snext somefile
+
+ au! SpellFileMissing
+ bwipe!
+ set nospell spelllang=en
+endfunc
+
func Test_spelldump()
" In case the spell file is not found avoid getting the download dialog, we
" would get stuck at the prompt.