Mercurial > vim
changeset 24250:01b274c3f69b v8.2.2666
patch 8.2.2666: Vim9: not enough function arguments checked for string
Commit: https://github.com/vim/vim/commit/c580943965fc9b006ec233bdee4ea5380f5594ea
Author: Bram Moolenaar <Bram@vim.org>
Date: Sat Mar 27 21:23:30 2021 +0100
patch 8.2.2666: Vim9: not enough function arguments checked for string
Problem: Vim9: not enough function arguments checked for string.
Solution: Check in ch_logfile(), char2nr() and others.
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Sat, 27 Mar 2021 21:30:02 +0100 |
parents | d50dd5561cc0 |
children | 0d7aa9d9bfbd |
files | src/channel.c src/eval.c src/evalfunc.c src/filepath.c src/testdir/test_vim9_builtin.vim src/version.c |
diffstat | 6 files changed, 54 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/src/channel.c +++ b/src/channel.c @@ -4883,6 +4883,11 @@ f_ch_logfile(typval_T *argvars, typval_T // Don't open a file in restricted mode. if (check_restricted() || check_secure()) return; + if (in_vim9script() + && (check_for_string_arg(argvars, 0) == FAIL + || check_for_string_arg(argvars, 1) == FAIL)) + return; + fname = tv_get_string(&argvars[0]); if (argvars[1].v_type == VAR_STRING) opt = tv_get_string_buf(&argvars[1], buf);
--- a/src/eval.c +++ b/src/eval.c @@ -5298,6 +5298,9 @@ var2fpos( return &pos; } + if (in_vim9script() && check_for_string_arg(varp, 0) == FAIL) + return NULL; + name = tv_get_string_chk(varp); if (name == NULL) return NULL;
--- a/src/evalfunc.c +++ b/src/evalfunc.c @@ -2521,6 +2521,8 @@ f_changenr(typval_T *argvars UNUSED, typ static void f_char2nr(typval_T *argvars, typval_T *rettv) { + if (in_vim9script() && check_for_string_arg(argvars, 0) == FAIL) + return; if (has_mbyte) { int utf8 = 0; @@ -2685,11 +2687,16 @@ f_confirm(typval_T *argvars UNUSED, typv char_u *typestr; int error = FALSE; + if (in_vim9script() && check_for_string_arg(argvars, 0) == FAIL) + return; + message = tv_get_string_chk(&argvars[0]); if (message == NULL) error = TRUE; if (argvars[1].v_type != VAR_UNKNOWN) { + if (in_vim9script() && check_for_string_arg(argvars, 1) == FAIL) + return; buttons = tv_get_string_buf_chk(&argvars[1], buf); if (buttons == NULL) error = TRUE; @@ -2698,6 +2705,8 @@ f_confirm(typval_T *argvars UNUSED, typv def = (int)tv_get_number_chk(&argvars[2], &error); if (argvars[3].v_type != VAR_UNKNOWN) { + if (in_vim9script() && check_for_string_arg(argvars, 3) == FAIL) + return; typestr = tv_get_string_buf_chk(&argvars[3], buf2); if (typestr == NULL) error = TRUE;
--- a/src/filepath.c +++ b/src/filepath.c @@ -788,9 +788,13 @@ f_chdir(typval_T *argvars, typval_T *ret rettv->vval.v_string = NULL; if (argvars[0].v_type != VAR_STRING) + { // Returning an empty string means it failed. // No error message, for historic reasons. + if (in_vim9script()) + (void) check_for_string_arg(argvars, 0); return; + } // Return the current directory cwd = alloc(MAXPATHL);
--- a/src/testdir/test_vim9_builtin.vim +++ b/src/testdir/test_vim9_builtin.vim @@ -204,14 +204,41 @@ def Test_call_call() l->assert_equal([1, 2, 3]) enddef +def Test_ch_logfile() + assert_fails('ch_logfile(true)', 'E1174') + assert_fails('ch_logfile("foo", true)', 'E1174') +enddef + def Test_char2nr() char2nr('あ', true)->assert_equal(12354) + + assert_fails('char2nr(true)', 'E1174') +enddef + +def Test_charclass() + assert_fails('charclass(true)', 'E1174') +enddef + +def Test_chdir() + assert_fails('chdir(true)', 'E1174') enddef def Test_col() new setline(1, 'asdf') col([1, '$'])->assert_equal(5) + + assert_fails('col(true)', 'E1174') +enddef + +def Test_confirm() + if !has('dialog_con') && !has('dialog_gui') + CheckFeature dialog_con + endif + + assert_fails('call confirm(true)', 'E1174') + assert_fails('call confirm("yes", true)', 'E1174') + assert_fails('call confirm("yes", "maybe", 2, true)', 'E1174') enddef def Test_copy_return_type() @@ -675,6 +702,10 @@ def Test_keys_return_type() var->assert_equal(['a', 'b']) enddef +def Test_line() + assert_fails('line(true)', 'E1174') +enddef + def Test_list2str_str2list_utf8() var s = "\u3042\u3044" var l = [0x3042, 0x3044]