changeset 23513:872239543313 v8.2.2299

patch 8.2.2299: Vim9: invalid memory access making error message flaky Commit: https://github.com/vim/vim/commit/d1510ee9469f623c872a18b6e3c3666c0fb23c58 Author: Bram Moolenaar <Bram@vim.org> Date: Mon Jan 4 16:15:58 2021 +0100 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 https://github.com/vim/vim/issues/7467)
author Bram Moolenaar <Bram@vim.org>
date Mon, 04 Jan 2021 16:30:03 +0100
parents bfa661680680
children 4ef3685b280a
files src/errors.h src/ex_docmd.c src/testdir/test_vim9_cmd.vim src/version.c src/vim9compile.c src/vim9execute.c
diffstat 6 files changed, 40 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/src/errors.h
+++ b/src/errors.h
@@ -16,6 +16,8 @@ EXTERN char e_undefined_variable_str[]
 EXTERN char e_undefined_variable_char_str[]
 	INIT(= N_("E121: Undefined variable: %c:%s"));
 #endif
+EXTERN char e_ambiguous_use_of_user_defined_command[]
+	INIT(= N_("E464: Ambiguous use of user-defined command"));
 EXTERN char e_invalid_command[]
 	INIT(= N_("E476: Invalid command"));
 #ifdef FEAT_EVAL
--- a/src/ex_docmd.c
+++ b/src/ex_docmd.c
@@ -2025,7 +2025,7 @@ do_one_cmd(
     if (p == NULL)
     {
 	if (!ea.skip)
-	    errormsg = _("E464: Ambiguous use of user-defined command");
+	    errormsg = _(e_ambiguous_use_of_user_defined_command);
 	goto doend;
     }
     // Check for wrong commands.
@@ -3531,9 +3531,11 @@ find_ex_command(
 	eap->cmdidx = CMD_finally;
 
 #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 != '!'
-	    && (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);
 	eap->cmdidx = CMD_SIZE;
--- a/src/testdir/test_vim9_cmd.vim
+++ b/src/testdir/test_vim9_cmd.vim
@@ -771,6 +771,24 @@ def Test_f_args()
   CheckScriptSuccess(lines)
 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()
   var lines =<< trim END
     vim9script
@@ -798,12 +816,14 @@ def Test_cmd_argument_without_colon()
 enddef
 
 def Test_ambiguous_user_cmd()
+  command Cmd1 eval 0
+  command Cmd2 eval 0
   var lines =<< trim END
-      com Cmd1 eval 0
-      com Cmd2 eval 0
       Cmd
   END
-  CheckScriptFailure(lines, 'E464:')
+  CheckDefAndScriptFailure(lines, 'E464:', 1)
+  delcommand Cmd1
+  delcommand Cmd2
 enddef
 
 def Test_command_not_recognized()
--- a/src/version.c
+++ b/src/version.c
@@ -751,6 +751,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    2299,
+/**/
     2298,
 /**/
     2297,
--- a/src/vim9compile.c
+++ b/src/vim9compile.c
@@ -7797,6 +7797,13 @@ compile_def_function(ufunc_T *ufunc, int
 		   : (int (*)(char_u *, size_t, void *, cctx_T *))lookup_local,
 									&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 (cctx.ctx_skip == SKIP_YES)
--- a/src/vim9execute.c
+++ b/src/vim9execute.c
@@ -3054,6 +3054,7 @@ call_def_function(
 			goto failed;
 		    ++ectx.ec_stack.ga_len;
 		    tv = STACK_TV_BOT(-1);
+		    ea.addr_count = 0;
 		    ea.addr_type = ADDR_LINES;
 		    ea.cmd = iptr->isn_arg.string;
 		    if (parse_cmd_address(&ea, &errormsg, FALSE) == FAIL)