From: Bram Moolenaar Date: Sun, 24 Apr 2022 20:33:20 +0000 (+0100) Subject: patch 8.2.4821: crash when imported autoload script was deleted X-Git-Tag: v8.2.4821 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=aac12daa61d9e84616771ec9242fd232f46786e6;p=vim patch 8.2.4821: crash when imported autoload script was deleted Problem: Crash when imported autoload script was deleted. Solution: Initialize local variable. (closes #10274) Give a more meaningful error message. --- diff --git a/src/eval.c b/src/eval.c index 61b09fb6b..f7445bf40 100644 --- a/src/eval.c +++ b/src/eval.c @@ -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 diff --git a/src/testdir/test_vim9_import.vim b/src/testdir/test_vim9_import.vim index 82fea6efe..159e51b2f 100644 --- a/src/testdir/test_vim9_import.vim +++ b/src/testdir/test_vim9_import.vim @@ -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 diff --git a/src/version.c b/src/version.c index 62d6e5df3..36adeb6d6 100644 --- a/src/version.c +++ b/src/version.c @@ -746,6 +746,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 4821, /**/ 4820, /**/ diff --git a/src/vim9script.c b/src/vim9script.c index 4f0190e41..bb5f0299d 100644 --- a/src/vim9script.c +++ b/src/vim9script.c @@ -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".