0
0
mirror of https://github.com/vim/vim.git synced 2025-11-10 10:47:23 -05:00

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: #17511

Signed-off-by: zeertzjq <zeertzjq@outlook.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
This commit is contained in:
zeertzjq
2025-06-10 20:06:53 +02:00
committed by Christian Brabandt
parent 446a98f0b6
commit 91782b4aeb
3 changed files with 40 additions and 11 deletions

View File

@@ -1415,17 +1415,19 @@ cp_compare_nearest(const void* a, const void* b)
static void static void
set_fuzzy_score(void) set_fuzzy_score(void)
{ {
if (compl_leader.string != NULL && compl_leader.length > 0) compl_T *compl;
{
compl_T *compl = compl_first_match;
do if (!compl_first_match
{ || compl_leader.string == NULL || compl_leader.length == 0)
compl->cp_score = fuzzy_match_str(compl->cp_str.string, return;
compl_leader.string);
compl = compl->cp_next; compl = compl_first_match;
} while (compl != NULL && !is_first_match(compl)); do
} {
compl->cp_score = fuzzy_match_str(compl->cp_str.string,
compl_leader.string);
compl = compl->cp_next;
} while (compl != NULL && !is_first_match(compl));
} }
/* /*
@@ -1434,11 +1436,12 @@ set_fuzzy_score(void)
static void static void
sort_compl_match_list(int (*compare)(const void *, const void *)) sort_compl_match_list(int (*compare)(const void *, const void *))
{ {
compl_T *compl = compl_first_match->cp_prev; compl_T *compl;
if (!compl_first_match || is_first_match(compl_first_match->cp_next)) if (!compl_first_match || is_first_match(compl_first_match->cp_next))
return; return;
compl = compl_first_match->cp_prev;
ins_compl_make_linear(); ins_compl_make_linear();
if (compl_shows_dir_forward()) if (compl_shows_dir_forward())
{ {

View File

@@ -4754,4 +4754,28 @@ 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
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

View File

@@ -709,6 +709,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
1447,
/**/ /**/
1446, 1446,
/**/ /**/