mirror of
https://github.com/neovim/neovim.git
synced 2025-02-25 18:55:25 -06:00
vim-patch:8.2.0634: crash with null partial and blob
Problem: Crash with null partial and blob.
Solution: Check for NULL pointer. Add more tests. (Yegappan Lakshmanan,
closes vim/vim#5984)
92b83ccfda
Co-authored-by: Bram Moolenaar <Bram@vim.org>
This commit is contained in:
parent
4b49f312a0
commit
85741677c8
@ -4059,7 +4059,10 @@ char *partial_name(partial_T *pt)
|
|||||||
if (pt->pt_name != NULL) {
|
if (pt->pt_name != NULL) {
|
||||||
return pt->pt_name;
|
return pt->pt_name;
|
||||||
}
|
}
|
||||||
return pt->pt_func->uf_name;
|
if (pt->pt_func != NULL) {
|
||||||
|
return pt->pt_func->uf_name;
|
||||||
|
}
|
||||||
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
static void partial_free(partial_T *pt)
|
static void partial_free(partial_T *pt)
|
||||||
|
@ -42,6 +42,7 @@ function Test_getbufwintabinfo()
|
|||||||
sign undefine Mark
|
sign undefine Mark
|
||||||
enew!
|
enew!
|
||||||
endif
|
endif
|
||||||
|
call assert_notequal([], getbufinfo(v:_null_dict))
|
||||||
|
|
||||||
only
|
only
|
||||||
let w1_id = win_getid()
|
let w1_id = win_getid()
|
||||||
|
@ -106,6 +106,7 @@ func Test_chdir_func()
|
|||||||
call assert_equal("", d)
|
call assert_equal("", d)
|
||||||
" Should not crash
|
" Should not crash
|
||||||
call chdir(d)
|
call chdir(d)
|
||||||
|
call assert_equal('', chdir([]))
|
||||||
|
|
||||||
only | tabonly
|
only | tabonly
|
||||||
call chdir(topdir)
|
call chdir(topdir)
|
||||||
|
@ -39,6 +39,9 @@ func Test_mkdir_p()
|
|||||||
call assert_fails('call mkdir("Xfile", "p")', 'E739')
|
call assert_fails('call mkdir("Xfile", "p")', 'E739')
|
||||||
call delete('Xfile')
|
call delete('Xfile')
|
||||||
call delete('Xmkdir', 'rf')
|
call delete('Xmkdir', 'rf')
|
||||||
|
call assert_equal(0, mkdir(v:_null_string))
|
||||||
|
call assert_fails('call mkdir([])', 'E730')
|
||||||
|
call assert_fails('call mkdir("abc", [], [])', 'E745')
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
func Test_line_continuation()
|
func Test_line_continuation()
|
||||||
@ -212,6 +215,8 @@ func Test_execute_cmd_with_null()
|
|||||||
execute v:_null_string
|
execute v:_null_string
|
||||||
" Nvim doesn't have null partials
|
" Nvim doesn't have null partials
|
||||||
" call assert_fails('execute test_null_partial()', 'E729:')
|
" call assert_fails('execute test_null_partial()', 'E729:')
|
||||||
|
" Nvim doesn't have test_unknown()
|
||||||
|
" call assert_fails('execute test_unknown()', 'E908:')
|
||||||
if has('job')
|
if has('job')
|
||||||
call assert_fails('execute test_null_job()', 'E908:')
|
call assert_fails('execute test_null_job()', 'E908:')
|
||||||
call assert_fails('execute test_null_channel()', 'E908:')
|
call assert_fails('execute test_null_channel()', 'E908:')
|
||||||
|
@ -25,6 +25,8 @@ func Test_equal()
|
|||||||
" Nvim doesn't have null functions
|
" Nvim doesn't have null functions
|
||||||
" call assert_equal(0, test_null_function() == function('min'))
|
" call assert_equal(0, test_null_function() == function('min'))
|
||||||
" call assert_equal(1, test_null_function() == test_null_function())
|
" call assert_equal(1, test_null_function() == test_null_function())
|
||||||
|
" Nvim doesn't have test_unknown()
|
||||||
|
" call assert_fails('eval 10 == test_unknown()', 'E685:')
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
func Test_version()
|
func Test_version()
|
||||||
@ -137,7 +139,7 @@ func Test_loop_over_null_list()
|
|||||||
endfor
|
endfor
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
func Test_set_reg_null_list()
|
func Test_setreg_null_list()
|
||||||
call setreg('x', v:_null_list)
|
call setreg('x', v:_null_list)
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
|
@ -990,6 +990,7 @@ func Test_matchstrpos()
|
|||||||
call assert_equal(['', -1, -1], matchstrpos('testing', 'ing', 8))
|
call assert_equal(['', -1, -1], matchstrpos('testing', 'ing', 8))
|
||||||
call assert_equal(['ing', 1, 4, 7], matchstrpos(['vim', 'testing', 'execute'], 'ing'))
|
call assert_equal(['ing', 1, 4, 7], matchstrpos(['vim', 'testing', 'execute'], 'ing'))
|
||||||
call assert_equal(['', -1, -1, -1], matchstrpos(['vim', 'testing', 'execute'], 'img'))
|
call assert_equal(['', -1, -1, -1], matchstrpos(['vim', 'testing', 'execute'], 'img'))
|
||||||
|
call assert_equal(['', -1, -1], matchstrpos(v:_null_list, '\a'))
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
func Test_nextnonblank_prevnonblank()
|
func Test_nextnonblank_prevnonblank()
|
||||||
@ -1284,6 +1285,7 @@ func Test_hlexists()
|
|||||||
syntax off
|
syntax off
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
|
" Test for the col() function
|
||||||
func Test_col()
|
func Test_col()
|
||||||
new
|
new
|
||||||
call setline(1, 'abcdef')
|
call setline(1, 'abcdef')
|
||||||
@ -1435,6 +1437,8 @@ func Test_inputlist()
|
|||||||
call assert_equal(-2, c)
|
call assert_equal(-2, c)
|
||||||
|
|
||||||
call assert_fails('call inputlist("")', 'E686:')
|
call assert_fails('call inputlist("")', 'E686:')
|
||||||
|
" Nvim accepts null list as empty list
|
||||||
|
" call assert_fails('call inputlist(v:_null_list)', 'E686:')
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
func Test_range_inputlist()
|
func Test_range_inputlist()
|
||||||
@ -2357,6 +2361,16 @@ func Test_garbagecollect_now_fails()
|
|||||||
let v:testing = 1
|
let v:testing = 1
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
|
" Test for echo highlighting
|
||||||
|
func Test_echohl()
|
||||||
|
echohl Search
|
||||||
|
echo 'Vim'
|
||||||
|
call assert_equal('Vim', Screenline(&lines))
|
||||||
|
" TODO: How to check the highlight group used by echohl?
|
||||||
|
" ScreenAttrs() returns all zeros.
|
||||||
|
echohl None
|
||||||
|
endfunc
|
||||||
|
|
||||||
" Test for the eval() function
|
" Test for the eval() function
|
||||||
func Test_eval()
|
func Test_eval()
|
||||||
call assert_fails("call eval('5 a')", 'E488:')
|
call assert_fails("call eval('5 a')", 'E488:')
|
||||||
@ -2515,6 +2529,18 @@ func Test_glob()
|
|||||||
call assert_fails("call glob('*', 0, {})", 'E728:')
|
call assert_fails("call glob('*', 0, {})", 'E728:')
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
|
" Test for browse()
|
||||||
|
func Test_browse()
|
||||||
|
CheckFeature browse
|
||||||
|
call assert_fails('call browse([], "open", "x", "a.c")', 'E745:')
|
||||||
|
endfunc
|
||||||
|
|
||||||
|
" Test for browsedir()
|
||||||
|
func Test_browsedir()
|
||||||
|
CheckFeature browse
|
||||||
|
call assert_fails('call browsedir("open", [])', 'E730:')
|
||||||
|
endfunc
|
||||||
|
|
||||||
func HasDefault(msg = 'msg')
|
func HasDefault(msg = 'msg')
|
||||||
return a:msg
|
return a:msg
|
||||||
endfunc
|
endfunc
|
||||||
|
@ -150,6 +150,12 @@ func Test_get_func()
|
|||||||
call assert_equal({'func has': 'no dict'}, get(l:F, 'dict', {'func has': 'no dict'}))
|
call assert_equal({'func has': 'no dict'}, get(l:F, 'dict', {'func has': 'no dict'}))
|
||||||
call assert_equal(0, get(l:F, 'dict'))
|
call assert_equal(0, get(l:F, 'dict'))
|
||||||
call assert_equal([], get(l:F, 'args'))
|
call assert_equal([], get(l:F, 'args'))
|
||||||
|
" Nvim doesn't have null functions
|
||||||
|
" let NF = test_null_function()
|
||||||
|
" call assert_equal('', get(NF, 'name'))
|
||||||
|
" call assert_equal(NF, get(NF, 'func'))
|
||||||
|
" call assert_equal(0, get(NF, 'dict'))
|
||||||
|
" call assert_equal([], get(NF, 'args'))
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
" get({partial}, {what} [, {default}]) - in test_partial.vim
|
" get({partial}, {what} [, {default}]) - in test_partial.vim
|
||||||
|
@ -794,6 +794,7 @@ func Test_listdict_compare_complex()
|
|||||||
call assert_true(dict4 == dict4copy)
|
call assert_true(dict4 == dict4copy)
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
|
" Test for extending lists and dictionaries
|
||||||
func Test_listdict_extend()
|
func Test_listdict_extend()
|
||||||
" Test extend() with lists
|
" Test extend() with lists
|
||||||
|
|
||||||
@ -1028,6 +1029,9 @@ func Test_listdict_index()
|
|||||||
call assert_fails("let l[1.1] = 4", 'E806:')
|
call assert_fails("let l[1.1] = 4", 'E806:')
|
||||||
call assert_fails("let l[:i] = [4, 5]", 'E121:')
|
call assert_fails("let l[:i] = [4, 5]", 'E121:')
|
||||||
call assert_fails("let l[:3.2] = [4, 5]", 'E806:')
|
call assert_fails("let l[:3.2] = [4, 5]", 'E806:')
|
||||||
|
" Nvim doesn't have test_unknown()
|
||||||
|
" let t = test_unknown()
|
||||||
|
" call assert_fails("echo t[0]", 'E685:')
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
" Test for a null list
|
" Test for a null list
|
||||||
@ -1079,9 +1083,20 @@ func Test_null_dict()
|
|||||||
call assert_equal(0, values(d))
|
call assert_equal(0, values(d))
|
||||||
call assert_false(has_key(d, 'k'))
|
call assert_false(has_key(d, 'k'))
|
||||||
call assert_equal('{}', string(d))
|
call assert_equal('{}', string(d))
|
||||||
call assert_fails('let x = v:_null_dict[10]')
|
call assert_fails('let x = d[10]')
|
||||||
call assert_equal({}, {})
|
call assert_equal({}, {})
|
||||||
call assert_equal(0, len(copy(d)))
|
call assert_equal(0, len(copy(d)))
|
||||||
|
call assert_equal(0, count(d, 'k'))
|
||||||
|
call assert_equal({}, deepcopy(d))
|
||||||
|
call assert_equal(20, get(d, 'k', 20))
|
||||||
|
call assert_equal(0, min(d))
|
||||||
|
call assert_equal(0, max(d))
|
||||||
|
call assert_equal(0, remove(d, 'k'))
|
||||||
|
call assert_equal('{}', string(d))
|
||||||
|
" call assert_equal(0, extend(d, d, 0))
|
||||||
|
lockvar d
|
||||||
|
call assert_equal(1, islocked('d'))
|
||||||
|
unlockvar d
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
" Test for the indexof() function
|
" Test for the indexof() function
|
||||||
|
@ -408,6 +408,8 @@ func Test_null()
|
|||||||
echom v:_null_dict
|
echom v:_null_dict
|
||||||
echom v:_null_blob
|
echom v:_null_blob
|
||||||
echom v:_null_string
|
echom v:_null_string
|
||||||
|
" Nvim doesn't have NULL functions
|
||||||
|
" echom test_null_function()
|
||||||
" Nvim doesn't have NULL partials
|
" Nvim doesn't have NULL partials
|
||||||
" echom test_null_partial()
|
" echom test_null_partial()
|
||||||
if has('job')
|
if has('job')
|
||||||
|
@ -194,6 +194,10 @@ func Test_partial_string()
|
|||||||
call assert_equal("function('MyFunc', {'one': 1})", string(F))
|
call assert_equal("function('MyFunc', {'one': 1})", string(F))
|
||||||
let F = function('MyFunc', ['foo'], d)
|
let F = function('MyFunc', ['foo'], d)
|
||||||
call assert_equal("function('MyFunc', ['foo'], {'one': 1})", string(F))
|
call assert_equal("function('MyFunc', ['foo'], {'one': 1})", string(F))
|
||||||
|
" Nvim doesn't have null functions
|
||||||
|
" call assert_equal("function('')", string(test_null_function()))
|
||||||
|
" Nvim doesn't have null partials
|
||||||
|
" call assert_equal("function('')", string(test_null_partial()))
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
func Test_func_unref()
|
func Test_func_unref()
|
||||||
|
@ -2425,6 +2425,16 @@ func Xproperty_tests(cchar)
|
|||||||
call assert_equal(246, d.context)
|
call assert_equal(246, d.context)
|
||||||
" set other Vim data types as context
|
" set other Vim data types as context
|
||||||
call g:Xsetlist([], 'a', {'context' : v:_null_blob})
|
call g:Xsetlist([], 'a', {'context' : v:_null_blob})
|
||||||
|
if has('channel')
|
||||||
|
call g:Xsetlist([], 'a', {'context' : test_null_channel()})
|
||||||
|
endif
|
||||||
|
if has('job')
|
||||||
|
call g:Xsetlist([], 'a', {'context' : test_null_job()})
|
||||||
|
endif
|
||||||
|
" Nvim doesn't have null functions
|
||||||
|
" call g:Xsetlist([], 'a', {'context' : test_null_function()})
|
||||||
|
" Nvim doesn't have null partials
|
||||||
|
" call g:Xsetlist([], 'a', {'context' : test_null_partial()})
|
||||||
call g:Xsetlist([], 'a', {'context' : ''})
|
call g:Xsetlist([], 'a', {'context' : ''})
|
||||||
call test_garbagecollect_now()
|
call test_garbagecollect_now()
|
||||||
if a:cchar == 'l'
|
if a:cchar == 'l'
|
||||||
|
@ -6508,9 +6508,17 @@ func Test_type()
|
|||||||
call assert_equal(v:t_float, type(0.0))
|
call assert_equal(v:t_float, type(0.0))
|
||||||
call assert_equal(v:t_bool, type(v:false))
|
call assert_equal(v:t_bool, type(v:false))
|
||||||
call assert_equal(v:t_bool, type(v:true))
|
call assert_equal(v:t_bool, type(v:true))
|
||||||
|
" call assert_equal(v:t_none, type(v:none))
|
||||||
|
" call assert_equal(v:t_none, type(v:null))
|
||||||
call assert_equal(v:t_string, type(v:_null_string))
|
call assert_equal(v:t_string, type(v:_null_string))
|
||||||
call assert_equal(v:t_list, type(v:_null_list))
|
call assert_equal(v:t_list, type(v:_null_list))
|
||||||
call assert_equal(v:t_dict, type(v:_null_dict))
|
call assert_equal(v:t_dict, type(v:_null_dict))
|
||||||
|
if has('job')
|
||||||
|
call assert_equal(v:t_job, type(test_null_job()))
|
||||||
|
endif
|
||||||
|
if has('channel')
|
||||||
|
call assert_equal(v:t_channel, type(test_null_channel()))
|
||||||
|
endif
|
||||||
call assert_equal(v:t_blob, type(v:_null_blob))
|
call assert_equal(v:t_blob, type(v:_null_blob))
|
||||||
|
|
||||||
call assert_equal(0, 0 + v:false)
|
call assert_equal(0, 0 + v:false)
|
||||||
|
Loading…
Reference in New Issue
Block a user