To: vim_dev@googlegroups.com Subject: Patch 8.2.4653 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.2.4653 Problem: "import autoload" does not check the file name. Solution: Give an error if the file is not readable. (closes #10049) Files: src/filepath.c, src/proto/filepath.pro, src/errors.h, src/ex_cmds.c, src/ex_docmd.c, src/spellfile.c, src/testdir/test_vim9_import.vim *** ../vim-8.2.4652/src/filepath.c 2022-03-10 12:23:59.410154437 +0000 --- src/filepath.c 2022-03-31 11:30:25.779649106 +0100 *************** *** 893,924 **** } /* ! * "filereadable()" function */ ! void ! f_filereadable(typval_T *argvars, typval_T *rettv) { 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) { - n = TRUE; close(fd); } ! else ! n = FALSE; ! rettv->vval.v_number = n; } /* --- 893,926 ---- } /* ! * Return TRUE if "fname" is a readable file. */ ! int ! file_is_readable(char_u *fname) { int fd; #ifndef O_NONBLOCK # define O_NONBLOCK 0 #endif ! if (*fname && !mch_isdir(fname) ! && (fd = mch_open((char *)fname, O_RDONLY | O_NONBLOCK, 0)) >= 0) { close(fd); + return TRUE; } ! return FALSE; ! } ! /* ! * "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,1767 **** if (mch_isdir(fname)) { ! semsg(_(e_src_is_directory), fname); return; } if (*fname == NUL || (fd = mch_fopen((char *)fname, READBIN)) == NULL) --- 1763,1769 ---- if (mch_isdir(fname)) { ! semsg(_(e_str_is_directory), fname); return; } if (*fname == NUL || (fd = mch_fopen((char *)fname, READBIN)) == NULL) *** ../vim-8.2.4652/src/proto/filepath.pro 2021-01-13 19:37:44.439646243 +0000 --- src/proto/filepath.pro 2022-03-31 11:22:39.671936361 +0100 *************** *** 5,10 **** --- 5,11 ---- 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); *** ../vim-8.2.4652/src/errors.h 2022-03-21 19:47:27.908641008 +0000 --- src/errors.h 2022-03-31 11:20:33.795992048 +0100 *************** *** 30,37 **** #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[] INIT(= N_("E17: \"%s\" is a directory")); #endif #ifdef FEAT_EVAL --- 30,38 ---- #endif EXTERN char e_invalid_range[] INIT(= N_("E16: Invalid range")); ! #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 *** ../vim-8.2.4652/src/ex_cmds.c 2022-03-22 20:42:09.174172862 +0000 --- src/ex_cmds.c 2022-03-31 11:19:10.124021245 +0100 *************** *** 2116,2122 **** // with UNIX it is possible to open a directory if (mch_isdir(ffname)) { ! semsg(_(e_src_is_directory), ffname); return FAIL; } #endif --- 2116,2122 ---- // with UNIX it is possible to open a directory if (mch_isdir(ffname)) { ! semsg(_(e_str_is_directory), ffname); return FAIL; } #endif *** ../vim-8.2.4652/src/ex_docmd.c 2022-03-27 18:11:01.458525523 +0100 --- src/ex_docmd.c 2022-03-31 11:19:29.740015018 +0100 *************** *** 8386,8392 **** // with Unix it is possible to open a directory if (mch_isdir(fname)) { ! semsg(_(e_src_is_directory), fname); return NULL; } #endif --- 8386,8392 ---- // with Unix it is possible to open a directory if (mch_isdir(fname)) { ! semsg(_(e_str_is_directory), fname); return NULL; } #endif *** ../vim-8.2.4652/src/spellfile.c 2022-02-25 21:47:44.905532201 +0000 --- src/spellfile.c 2022-03-31 11:20:04.084003199 +0100 *************** *** 5976,5982 **** } if (mch_isdir(wfname)) { ! semsg(_(e_src_is_directory), wfname); goto theend; } --- 5976,5982 ---- } if (mch_isdir(wfname)) { ! semsg(_(e_str_is_directory), wfname); goto theend; } *** ../vim-8.2.4652/src/testdir/test_vim9_import.vim 2022-03-30 21:12:16.451923056 +0100 --- src/testdir/test_vim9_import.vim 2022-03-31 11:34:07.679485902 +0100 *************** *** 2508,2520 **** vim9script import autoload './doesNotExist.vim' END ! v9.CheckScriptSuccess(lines) lines =<< trim END vim9script import autoload '/dir/doesNotExist.vim' END ! v9.CheckScriptSuccess(lines) lines =<< trim END vim9script --- 2508,2526 ---- vim9script import autoload './doesNotExist.vim' END ! v9.CheckScriptFailure(lines, 'E282:', 2) lines =<< trim END vim9script import autoload '/dir/doesNotExist.vim' END ! v9.CheckScriptFailure(lines, 'E282:', 2) ! ! lines =<< trim END ! vim9script ! import autoload '../testdir' ! END ! v9.CheckScriptFailure(lines, 'E17:', 2) lines =<< trim END vim9script *** ../vim-8.2.4652/src/version.c 2022-03-31 10:13:44.130427942 +0100 --- src/version.c 2022-03-31 11:35:45.131411093 +0100 *************** *** 752,753 **** --- 752,755 ---- { /* Add new patch number below this line */ + /**/ + 4653, /**/ -- TALL KNIGHT: When you have found the shrubbery, then you must cut down the mightiest tree in the forest ... with a herring. "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// \\\ \\\ sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///