diff options
author | zeertzjq <zeertzjq@outlook.com> | 2023-04-12 23:51:43 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-04-12 23:51:43 +0800 |
commit | 23e9d625cf97715abce2c0dead416d8dcd9e6519 (patch) | |
tree | 9903ba14520313bf4626291fa9719bc2b37825a2 | |
parent | cdc028e97d9808c21e26fffe2d282b6517eaffc0 (diff) | |
download | rneovim-23e9d625cf97715abce2c0dead416d8dcd9e6519.tar.gz rneovim-23e9d625cf97715abce2c0dead416d8dcd9e6519.tar.bz2 rneovim-23e9d625cf97715abce2c0dead416d8dcd9e6519.zip |
vim-patch:9.0.1444: crash when passing NULL to setcmdline() (#23048)
Problem: Crash when passing NULL to setcmdline(). (Andreas Louv)
Solution: Use tv_get_string() instead of using v_string directly.
(closes vim/vim#12231, closes vim/vim#12227)
https://github.com/vim/vim/commit/ac6cd31afcbdd08bfa92ca33f7d4ce5773ba4353
-rw-r--r-- | src/nvim/ex_getln.c | 3 | ||||
-rw-r--r-- | test/old/testdir/test_cmdline.vim | 8 |
2 files changed, 10 insertions, 1 deletions
diff --git a/src/nvim/ex_getln.c b/src/nvim/ex_getln.c index ba403e3dd9..f3afbdcaaf 100644 --- a/src/nvim/ex_getln.c +++ b/src/nvim/ex_getln.c @@ -4209,7 +4209,8 @@ void f_setcmdline(typval_T *argvars, typval_T *rettv, EvalFuncData fptr) } } - rettv->vval.v_number = set_cmdline_str(argvars[0].vval.v_string, pos); + // Use tv_get_string() to handle a NULL string like an empty string. + rettv->vval.v_number = set_cmdline_str(tv_get_string(&argvars[0]), pos); } /// "setcmdpos()" function diff --git a/test/old/testdir/test_cmdline.vim b/test/old/testdir/test_cmdline.vim index 1dceb43e5d..6b2a754dd1 100644 --- a/test/old/testdir/test_cmdline.vim +++ b/test/old/testdir/test_cmdline.vim @@ -3532,6 +3532,14 @@ endfunc func Test_setcmdline() func SetText(text, pos) + call assert_equal(0, setcmdline(v:_null_string)) + call assert_equal('', getcmdline()) + call assert_equal(1, getcmdpos()) + + call assert_equal(0, setcmdline(''[: -1])) + call assert_equal('', getcmdline()) + call assert_equal(1, getcmdpos()) + autocmd CmdlineChanged * let g:cmdtype = expand('<afile>') call assert_equal(0, setcmdline(a:text)) call assert_equal(a:text, getcmdline()) |