1
0
forked from aniani/vim

patch 9.1.0065: Segfault with CompleteChanged autocommand

Problem:  Segfault with CompleteChanged autocommand
          (markonm )
Solution: Test match->cp_prev for being NULL before accessing it

closes: #13929

Signed-off-by: Christian Brabandt <cb@256bit.org>
This commit is contained in:
Christian Brabandt
2024-01-29 21:46:58 +01:00
parent 6e0a18f82b
commit fef6630166
3 changed files with 19 additions and 2 deletions

View File

@@ -3075,7 +3075,8 @@ info_add_completion_info(list_T *li)
// Skip the element with the CP_ORIGINAL_TEXT flag at the beginning, in case of // Skip the element with the CP_ORIGINAL_TEXT flag at the beginning, in case of
// forward completion, or at the end, in case of backward completion. // forward completion, or at the end, in case of backward completion.
match = forward ? match->cp_next : (compl_no_select && match_at_original_text(match) ? match->cp_prev : match->cp_prev->cp_prev); match = forward || match->cp_prev == NULL ? match->cp_next :
(compl_no_select && match_at_original_text(match) ? match->cp_prev : match->cp_prev->cp_prev);
while (match != NULL && !match_at_original_text(match)) while (match != NULL && !match_at_original_text(match))
{ {

View File

@@ -2359,4 +2359,18 @@ func Test_complete_info_index()
bwipe! bwipe!
endfunc endfunc
" vim: shiftwidth=2 sts=2 expandtab func Test_complete_changed_complete_info()
CheckRunVimInTerminal
" this used to crash vim, see #13929
let lines =<< trim END
set completeopt=menuone
autocmd CompleteChanged * call complete_info(['items'])
call feedkeys("iii\<cr>\<c-p>")
END
call writefile(lines, 'Xsegfault', 'D')
let buf = RunVimInTerminal('-S Xsegfault', #{rows: 5})
call WaitForAssert({-> assert_match('^ii', term_getline(buf, 1))}, 1000)
call StopVimInTerminal(buf)
endfunc
" vim: shiftwidth=2 sts=2 expandtab nofoldenable

View File

@@ -704,6 +704,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 */
/**/
65,
/**/ /**/
64, 64,
/**/ /**/