]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 8.2.4653: "import autoload" does not check the file name v8.2.4653
authorBram Moolenaar <Bram@vim.org>
Thu, 31 Mar 2022 10:37:57 +0000 (11:37 +0100)
committerBram Moolenaar <Bram@vim.org>
Thu, 31 Mar 2022 10:37:57 +0000 (11:37 +0100)
Problem:    "import autoload" does not check the file name.
Solution:   Give an error if the file is not readable. (closes #10049)

src/errors.h
src/ex_cmds.c
src/ex_docmd.c
src/filepath.c
src/proto/filepath.pro
src/spellfile.c
src/testdir/test_vim9_import.vim
src/version.c

index 949a5327941a22daf71fd4a332f372fd4e313429..951acabb2926df5f45ccf4b3f69e6d9fc8f94785 100644 (file)
@@ -30,8 +30,9 @@ EXTERN char e_invalid_expression_str[]
 #endif
 EXTERN char e_invalid_range[]
        INIT(= N_("E16: Invalid range"));
-#if defined(UNIX) || defined(FEAT_SYN_HL) || defined(FEAT_SPELL)
-EXTERN char e_src_is_directory[]
+#if defined(UNIX) || defined(FEAT_SYN_HL) \
+           || defined(FEAT_SPELL) || defined(FEAT_EVAL)
+EXTERN char e_str_is_directory[]
        INIT(= N_("E17: \"%s\" is a directory"));
 #endif
 #ifdef FEAT_EVAL
index be35845356acab647f88dc2474cfbb9fa951c5a2..25f06e623ca9861065c86215157ac11326a6ea1d 100644 (file)
@@ -2116,7 +2116,7 @@ check_overwrite(
            // with UNIX it is possible to open a directory
            if (mch_isdir(ffname))
            {
-               semsg(_(e_src_is_directory), ffname);
+               semsg(_(e_str_is_directory), ffname);
                return FAIL;
            }
 #endif
index c5e96bde5b8f8c9213385d26246ec62897bec661..c12f151c3a6632d965600302642fac1d9690b977 100644 (file)
@@ -8386,7 +8386,7 @@ open_exfile(
     // with Unix it is possible to open a directory
     if (mch_isdir(fname))
     {
-       semsg(_(e_src_is_directory), fname);
+       semsg(_(e_str_is_directory), fname);
        return NULL;
     }
 #endif
index f0da60f4527c850c08c75d2132e885769615ed8b..851091e57a315946cc10700ad00a691f89c8a62e 100644 (file)
@@ -893,32 +893,34 @@ f_exepath(typval_T *argvars, typval_T *rettv)
 }
 
 /*
- * "filereadable()" function
+ * Return TRUE if "fname" is a readable file.
  */
-    void
-f_filereadable(typval_T *argvars, typval_T *rettv)
+    int
+file_is_readable(char_u *fname)
 {
     int                fd;
-    char_u     *p;
-    int                n;
-
-    if (in_vim9script() && check_for_string_arg(argvars, 0) == FAIL)
-       return;
 
 #ifndef O_NONBLOCK
 # define O_NONBLOCK 0
 #endif
-    p = tv_get_string(&argvars[0]);
-    if (*p && !mch_isdir(p) && (fd = mch_open((char *)p,
-                                             O_RDONLY | O_NONBLOCK, 0)) >= 0)
+    if (*fname && !mch_isdir(fname)
+             && (fd = mch_open((char *)fname, O_RDONLY | O_NONBLOCK, 0)) >= 0)
     {
-       n = TRUE;
        close(fd);
+       return TRUE;
     }
-    else
-       n = FALSE;
+    return FALSE;
+}
 
-    rettv->vval.v_number = n;
+/*
+ * "filereadable()" function
+ */
+    void
+f_filereadable(typval_T *argvars, typval_T *rettv)
+{
+    if (in_vim9script() && check_for_string_arg(argvars, 0) == FAIL)
+       return;
+    rettv->vval.v_number = file_is_readable(tv_get_string(&argvars[0]));
 }
 
 /*
@@ -1761,7 +1763,7 @@ read_file_or_blob(typval_T *argvars, typval_T *rettv, int always_blob)
 
     if (mch_isdir(fname))
     {
-       semsg(_(e_src_is_directory), fname);
+       semsg(_(e_str_is_directory), fname);
        return;
     }
     if (*fname == NUL || (fd = mch_fopen((char *)fname, READBIN)) == NULL)
index 62612117db0948de7e4086b3eb718d2c2ad1a4cc..bf3d5163dad45b32038dc0ccdcba35f30949e7a1 100644 (file)
@@ -5,6 +5,7 @@ void f_chdir(typval_T *argvars, typval_T *rettv);
 void f_delete(typval_T *argvars, typval_T *rettv);
 void f_executable(typval_T *argvars, typval_T *rettv);
 void f_exepath(typval_T *argvars, typval_T *rettv);
+int file_is_readable(char_u *fname);
 void f_filereadable(typval_T *argvars, typval_T *rettv);
 void f_filewritable(typval_T *argvars, typval_T *rettv);
 void f_finddir(typval_T *argvars, typval_T *rettv);
index ad0d0002113ade9053673541093f1fed49f9cc3e..aaacb2e4483ba3f701c5ae4a99245beda06efe1a 100644 (file)
@@ -5976,7 +5976,7 @@ mkspell(
        }
        if (mch_isdir(wfname))
        {
-           semsg(_(e_src_is_directory), wfname);
+           semsg(_(e_str_is_directory), wfname);
            goto theend;
        }
 
index b1e96c5ea31f455a019bec288549f550a1b6b12f..c6a820654a0f49142b7aae2780c9f2e03fbd9d81 100644 (file)
@@ -2508,13 +2508,19 @@ def Test_import_autoload_fails()
       vim9script
       import autoload './doesNotExist.vim'
   END
-  v9.CheckScriptSuccess(lines)
+  v9.CheckScriptFailure(lines, 'E282:', 2)
 
   lines =<< trim END
       vim9script
       import autoload '/dir/doesNotExist.vim'
   END
-  v9.CheckScriptSuccess(lines)
+  v9.CheckScriptFailure(lines, 'E282:', 2)
+
+  lines =<< trim END
+      vim9script
+      import autoload '../testdir'
+  END
+  v9.CheckScriptFailure(lines, 'E17:', 2)
 
   lines =<< trim END
       vim9script
index 843affd3ed1d9676f58eceda4e5dc175092d0940..3db4108f3aba4694f868713c4d32e86583c650a2 100644 (file)
@@ -750,6 +750,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    4653,
 /**/
     4652,
 /**/