patch 9.1.1447: completion: crash when backspacing with fuzzy completion Commit: https://github.com/vim/vim/commit/91782b4aeb62043739138903f30cad2fe79238ab Author: zeertzjq <zeert...@outlook.com> Date: Tue Jun 10 20:06:53 2025 +0200
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 <zeert...@outlook.com> Signed-off-by: Christian Brabandt <c...@256bit.org> diff --git a/src/insexpand.c b/src/insexpand.c index 889ea3611..9ee73e15e 100644 --- a/src/insexpand.c +++ b/src/insexpand.c @@ -1415,17 +1415,19 @@ cp_compare_nearest(const void* a, const void* b) static void set_fuzzy_score(void) { - if (compl_leader.string != NULL && compl_leader.length > 0) - { - compl_T *compl = compl_first_match; + compl_T *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)); - } + if (!compl_first_match + || compl_leader.string == NULL || compl_leader.length == 0) + return; + + compl = compl_first_match; + 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 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)) return; + compl = compl_first_match->cp_prev; ins_compl_make_linear(); if (compl_shows_dir_forward()) { diff --git a/src/testdir/test_ins_complete.vim b/src/testdir/test_ins_complete.vim index 33c87cb2c..155c5b796 100644 --- a/src/testdir/test_ins_complete.vim +++ b/src/testdir/test_ins_complete.vim @@ -4754,4 +4754,28 @@ func Test_complete_unloaded_buf_refresh_always() delfunc TestComplete 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 diff --git a/src/version.c b/src/version.c index b384859de..05be1d862 100644 --- a/src/version.c +++ b/src/version.c @@ -709,6 +709,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1447, /**/ 1446, /**/ -- -- You received this message from the "vim_dev" maillist. Do not top-post! Type your reply below the text you are replying to. For more information, visit http://www.vim.org/maillist.php --- You received this message because you are subscribed to the Google Groups "vim_dev" group. To unsubscribe from this group and stop receiving emails from it, send an email to vim_dev+unsubscr...@googlegroups.com. To view this discussion visit https://groups.google.com/d/msgid/vim_dev/E1uP3V4-00BmyW-Lo%40256bit.org.