mirror of
https://github.com/neovim/neovim
synced 2025-07-16 09:11:51 +00:00
vim-patch:9.1.1447: completion: crash when backspacing with fuzzy completion
Problem: completion: crash when backspacing with fuzzy completion
Solution: Don't dereference compl_first_match when it's NULL
(zeertzjq).
related: neovim/neovim#34419
closes: vim/vim#17511
91782b4aeb
This commit is contained in:
@ -1339,13 +1339,15 @@ static int cp_compare_nearest(const void *a, const void *b)
|
|||||||
/// Set fuzzy score.
|
/// Set fuzzy score.
|
||||||
static void set_fuzzy_score(void)
|
static void set_fuzzy_score(void)
|
||||||
{
|
{
|
||||||
if (compl_leader.data != NULL && compl_leader.size > 0) {
|
if (!compl_first_match || compl_leader.data == NULL || compl_leader.size == 0) {
|
||||||
compl_T *comp = compl_first_match;
|
return;
|
||||||
do {
|
|
||||||
comp->cp_score = fuzzy_match_str(comp->cp_str.data, compl_leader.data);
|
|
||||||
comp = comp->cp_next;
|
|
||||||
} while (comp != NULL && !is_first_match(comp));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
compl_T *comp = compl_first_match;
|
||||||
|
do {
|
||||||
|
comp->cp_score = fuzzy_match_str(comp->cp_str.data, compl_leader.data);
|
||||||
|
comp = comp->cp_next;
|
||||||
|
} while (comp != NULL && !is_first_match(comp));
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Sort completion matches, excluding the node that contains the leader.
|
/// Sort completion matches, excluding the node that contains the leader.
|
||||||
|
@ -4835,4 +4835,29 @@ func Test_complete_unloaded_buf_refresh_always()
|
|||||||
delfunc TestComplete
|
delfunc TestComplete
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
|
func Test_complete_fuzzy_omnifunc_backspace()
|
||||||
|
let g:do_complete = v:false
|
||||||
|
func Omni_test(findstart, base)
|
||||||
|
if a:findstart
|
||||||
|
let g:do_complete = !g:do_complete
|
||||||
|
endif
|
||||||
|
if g:do_complete
|
||||||
|
return a:findstart ? 0 : [#{word: a:base .. 'def'}, #{word: a:base .. 'ghi'}]
|
||||||
|
endif
|
||||||
|
return a:findstart ? -3 : {}
|
||||||
|
endfunc
|
||||||
|
|
||||||
|
new
|
||||||
|
redraw " need this to prevent NULL dereference in Nvim
|
||||||
|
setlocal omnifunc=Omni_test
|
||||||
|
setlocal completeopt=menuone,fuzzy,noinsert
|
||||||
|
call setline(1, 'abc')
|
||||||
|
call feedkeys("A\<C-X>\<C-O>\<BS>\<Esc>0", 'tx!')
|
||||||
|
call assert_equal('ab', getline(1))
|
||||||
|
|
||||||
|
bwipe!
|
||||||
|
delfunc Omni_test
|
||||||
|
unlet g:do_complete
|
||||||
|
endfunc
|
||||||
|
|
||||||
" vim: shiftwidth=2 sts=2 expandtab nofoldenable
|
" vim: shiftwidth=2 sts=2 expandtab nofoldenable
|
||||||
|
Reference in New Issue
Block a user