]> granicus.if.org Git - vim/commitdiff
patch 8.2.2299: Vim9: invalid memory access making error message flaky v8.2.2299
authorBram Moolenaar <Bram@vim.org>
Mon, 4 Jan 2021 15:15:58 +0000 (16:15 +0100)
committerBram Moolenaar <Bram@vim.org>
Mon, 4 Jan 2021 15:15:58 +0000 (16:15 +0100)
Problem:    Vim9: invalid memory access making error message flaky.
Solution:   Do not check cmd_argt for CMD_USER. (issue #7467)

src/errors.h
src/ex_docmd.c
src/testdir/test_vim9_cmd.vim
src/version.c
src/vim9compile.c
src/vim9execute.c

index eb7239bd9458b3db2144fb9751c108ef3cf7744a..e71b706004156f81bc0b69d3b275729d38c83957 100644 (file)
@@ -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
index 044c18a85bce8a5e2d6c82eb8fd5bf7f0a542611..5a3a37abcbe2211e265d00372edcf337db368917 100644 (file)
@@ -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;
index ab311006829eb03c6b043dfc62dbad3f19c01043..c9e83d9bca65a7e830544cad8d4a630b82f25384 100644 (file)
@@ -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()
index a9057609289681d0241b4d73b0c3aa2cd3f9dc84..07113c4b3cf4bb63a975fe2f5b873f76967ff234 100644 (file)
@@ -750,6 +750,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    2299,
 /**/
     2298,
 /**/
index 80f918d9e000f9b59afb046901e439d509c9edbb..4007641bb0e8084aa373e9655d24a8bef1083ce8 100644 (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,
                                                                        &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)
index d0c2ebc706e1f793f6ac9ca0925bac436a5fd456..32ed04aeeffa95e5743d0e6162dd043678b73550 100644 (file)
@@ -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)