0
0
mirror of https://github.com/vim/vim.git synced 2025-07-26 11:04:33 -04:00

patch 8.2.2299: Vim9: invalid memory access making error message flaky

Problem:    Vim9: invalid memory access making error message flaky.
Solution:   Do not check cmd_argt for CMD_USER. (issue #7467)
This commit is contained in:
Bram Moolenaar 2021-01-04 16:15:58 +01:00
parent cef1270dec
commit d1510ee946
6 changed files with 40 additions and 6 deletions

View File

@ -16,6 +16,8 @@ EXTERN char e_undefined_variable_str[]
EXTERN char e_undefined_variable_char_str[] EXTERN char e_undefined_variable_char_str[]
INIT(= N_("E121: Undefined variable: %c:%s")); INIT(= N_("E121: Undefined variable: %c:%s"));
#endif #endif
EXTERN char e_ambiguous_use_of_user_defined_command[]
INIT(= N_("E464: Ambiguous use of user-defined command"));
EXTERN char e_invalid_command[] EXTERN char e_invalid_command[]
INIT(= N_("E476: Invalid command")); INIT(= N_("E476: Invalid command"));
#ifdef FEAT_EVAL #ifdef FEAT_EVAL

View File

@ -2025,7 +2025,7 @@ do_one_cmd(
if (p == NULL) if (p == NULL)
{ {
if (!ea.skip) if (!ea.skip)
errormsg = _("E464: Ambiguous use of user-defined command"); errormsg = _(e_ambiguous_use_of_user_defined_command);
goto doend; goto doend;
} }
// Check for wrong commands. // Check for wrong commands.
@ -3531,9 +3531,11 @@ find_ex_command(
eap->cmdidx = CMD_finally; eap->cmdidx = CMD_finally;
#ifdef FEAT_EVAL #ifdef FEAT_EVAL
if (eap->cmdidx != CMD_SIZE && in_vim9script() if (eap->cmdidx < CMD_SIZE
&& in_vim9script()
&& !IS_WHITE_OR_NUL(*p) && *p != '\n' && *p != '!' && !IS_WHITE_OR_NUL(*p) && *p != '\n' && *p != '!'
&& (cmdnames[eap->cmdidx].cmd_argt & EX_NONWHITE_OK) == 0) && (eap->cmdidx < 0 ||
(cmdnames[eap->cmdidx].cmd_argt & EX_NONWHITE_OK) == 0))
{ {
semsg(_(e_command_not_followed_by_white_space_str), eap->cmd); semsg(_(e_command_not_followed_by_white_space_str), eap->cmd);
eap->cmdidx = CMD_SIZE; eap->cmdidx = CMD_SIZE;

View File

@ -771,6 +771,24 @@ def Test_f_args()
CheckScriptSuccess(lines) CheckScriptSuccess(lines)
enddef enddef
def Test_user_command_comment()
command -nargs=1 Comd echom <q-args>
var lines =<< trim END
vim9script
Comd # comment
END
CheckScriptSuccess(lines)
lines =<< trim END
vim9script
Comd# comment
END
CheckScriptFailure(lines, 'E1144:')
delcommand Comd
enddef
def Test_star_command() def Test_star_command()
var lines =<< trim END var lines =<< trim END
vim9script vim9script
@ -798,12 +816,14 @@ def Test_cmd_argument_without_colon()
enddef enddef
def Test_ambiguous_user_cmd() def Test_ambiguous_user_cmd()
command Cmd1 eval 0
command Cmd2 eval 0
var lines =<< trim END var lines =<< trim END
com Cmd1 eval 0
com Cmd2 eval 0
Cmd Cmd
END END
CheckScriptFailure(lines, 'E464:') CheckDefAndScriptFailure(lines, 'E464:', 1)
delcommand Cmd1
delcommand Cmd2
enddef enddef
def Test_command_not_recognized() def Test_command_not_recognized()

View File

@ -750,6 +750,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 */
/**/
2299,
/**/ /**/
2298, 2298,
/**/ /**/

View File

@ -7797,6 +7797,13 @@ compile_def_function(ufunc_T *ufunc, int check_return_type, cctx_T *outer_cctx)
: (int (*)(char_u *, size_t, void *, cctx_T *))lookup_local, : (int (*)(char_u *, size_t, void *, cctx_T *))lookup_local,
&cctx); &cctx);
if (p == NULL)
{
if (cctx.ctx_skip != SKIP_YES)
emsg(_(e_ambiguous_use_of_user_defined_command));
goto erret;
}
if (p == ea.cmd && ea.cmdidx != CMD_SIZE) if (p == ea.cmd && ea.cmdidx != CMD_SIZE)
{ {
if (cctx.ctx_skip == SKIP_YES) if (cctx.ctx_skip == SKIP_YES)

View File

@ -3054,6 +3054,7 @@ call_def_function(
goto failed; goto failed;
++ectx.ec_stack.ga_len; ++ectx.ec_stack.ga_len;
tv = STACK_TV_BOT(-1); tv = STACK_TV_BOT(-1);
ea.addr_count = 0;
ea.addr_type = ADDR_LINES; ea.addr_type = ADDR_LINES;
ea.cmd = iptr->isn_arg.string; ea.cmd = iptr->isn_arg.string;
if (parse_cmd_address(&ea, &errormsg, FALSE) == FAIL) if (parse_cmd_address(&ea, &errormsg, FALSE) == FAIL)