]> granicus.if.org Git - vim/commitdiff
patch 8.2.4821: crash when imported autoload script was deleted v8.2.4821
authorBram Moolenaar <Bram@vim.org>
Sun, 24 Apr 2022 20:33:20 +0000 (21:33 +0100)
committerBram Moolenaar <Bram@vim.org>
Sun, 24 Apr 2022 20:33:20 +0000 (21:33 +0100)
Problem:    Crash when imported autoload script was deleted.
Solution:   Initialize local variable. (closes #10274)  Give a more meaningful
            error message.

src/eval.c
src/testdir/test_vim9_import.vim
src/version.c
src/vim9script.c

index 61b09fb6b0cdff50a6f492290553d77db898d073..f7445bf40fff467c7ae12e19192ab47354b8da3c 100644 (file)
@@ -6159,7 +6159,7 @@ handle_subscript(
            char_u      *exp_name;
            int         cc;
            int         idx;
-           ufunc_T     *ufunc;
+           ufunc_T     *ufunc = NULL;
            type_T      *type;
 
            // Found script from "import {name} as name", script item name must
index 82fea6efe3383a3b08c8bb4120ba77f5e6a4a5d4..159e51b2febaebe50b7cc1c59f18c815a5c5cc80 100644 (file)
@@ -1137,6 +1137,25 @@ def Test_autoload_import_relative_autoload_dir()
   delete('autoload', 'rf')
 enddef
 
+def Test_autoload_import_deleted()
+  var lines =<< trim END
+      vim9script
+      export const FOO = 1
+  END
+  writefile(lines, 'Xa.vim')
+
+  lines =<< trim END
+      vim9script
+      import autoload './Xa.vim'
+
+      delete('Xa.vim')
+      var x = Xa.FOO
+  END
+  v9.CheckScriptFailure(lines, 'E484:')
+
+  delete('Xdir', 'rf')
+enddef
+
 func Test_import_in_diffexpr()
   CheckExecutable diff
 
index 62d6e5df3f6c2ad7d66d43136dfec7784d313a12..36adeb6d6d73097002418b785e5c475064ca1571 100644 (file)
@@ -746,6 +746,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    4821,
 /**/
     4820,
 /**/
index 4f0190e4127d26cf72a058fd245c48de3b5b4f85..bb5f0299dc0ccc61e97a2102b6aed80ab241f39f 100644 (file)
@@ -713,7 +713,10 @@ find_exported(
     if (script->sn_import_autoload && script->sn_state == SN_STATE_NOT_LOADED)
     {
        if (do_source(script->sn_name, FALSE, DOSO_NONE, NULL) == FAIL)
+       {
+           semsg(_(e_cant_open_file_str), script->sn_name);
            return -1;
+       }
     }
 
     // Find name in "script".