diff options
author | Bram Moolenaar <Bram@vim.org> | 2020-10-03 17:04:37 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2020-10-03 17:04:37 +0200 |
commit | c8fe645c198e2ca55c4e3446efbbdb9b995c63ce (patch) | |
tree | fe1529e5520e4be8c901d981ecd3a102dd522f0f /src | |
parent | 588d241d44fc25ad4c5a635ee4fdeafdfcee0fde (diff) | |
download | vim-git-c8fe645c198e2ca55c4e3446efbbdb9b995c63ce.tar.gz |
patch 8.2.1793: not consistently giving the "is a directory" warningv8.2.1793
Problem: Not consistently giving the "is a directory" warning.
Solution: Adjust check for illegal file name and directory. (Yasuhiro
Matsumoto, closes #7067)
Diffstat (limited to 'src')
-rw-r--r-- | src/fileio.c | 28 | ||||
-rw-r--r-- | src/testdir/test_edit.vim | 25 | ||||
-rw-r--r-- | src/version.c | 2 |
3 files changed, 45 insertions, 10 deletions
diff --git a/src/fileio.c b/src/fileio.c index aa6596df6..83924b352 100644 --- a/src/fileio.c +++ b/src/fileio.c @@ -211,6 +211,7 @@ readfile( char_u *old_b_fname; int using_b_ffname; int using_b_fname; + static char *msg_is_a_directory = N_("is a directory"); au_did_filetype = FALSE; // reset before triggering any autocommands @@ -310,22 +311,29 @@ readfile( else msg_scroll = TRUE; // don't overwrite previous file message - /* - * If the name ends in a path separator, we can't open it. Check here, - * because reading the file may actually work, but then creating the swap - * file may destroy it! Reported on MS-DOS and Win 95. - * If the name is too long we might crash further on, quit here. - */ if (fname != NULL && *fname != NUL) { - p = fname + STRLEN(fname); - if (after_pathsep(fname, p) || STRLEN(fname) >= MAXPATHL) + size_t namelen = STRLEN(fname); + + // If the name is too long we might crash further on, quit here. + if (namelen >= MAXPATHL) { filemess(curbuf, fname, (char_u *)_("Illegal file name"), 0); msg_end(); msg_scroll = msg_save; return FAIL; } + + // If the name ends in a path separator, we can't open it. Check here, + // because reading the file may actually work, but then creating the + // swap file may destroy it! Reported on MS-DOS and Win 95. + if (after_pathsep(fname, fname + namelen)) + { + filemess(curbuf, fname, (char_u *)_(msg_is_a_directory), 0); + msg_end(); + msg_scroll = msg_save; + return FAIL; + } } if (!read_stdin && !read_buffer && !read_fifo) @@ -349,7 +357,7 @@ readfile( if (S_ISDIR(perm)) { - filemess(curbuf, fname, (char_u *)_("is a directory"), 0); + filemess(curbuf, fname, (char_u *)_(msg_is_a_directory), 0); retval = NOTDONE; } else @@ -475,7 +483,7 @@ readfile( perm = mch_getperm(fname); // check if the file exists if (isdir_f) { - filemess(curbuf, sfname, (char_u *)_("is a directory"), 0); + filemess(curbuf, sfname, (char_u *)_(msg_is_a_directory), 0); curbuf->b_p_ro = TRUE; // must use "w!" now } else diff --git a/src/testdir/test_edit.vim b/src/testdir/test_edit.vim index 0dbca4533..660734557 100644 --- a/src/testdir/test_edit.vim +++ b/src/testdir/test_edit.vim @@ -1587,6 +1587,31 @@ func Test_edit_illegal_filename() close! endfunc +" Test for editing a directory +func Test_edit_is_a_directory() + CheckEnglish + let dirname = getcwd() . "/Xdir" + call mkdir(dirname, 'p') + + new + redir => msg + exe 'edit' dirname + redir END + call assert_match("is a directory$", split(msg, "\n")[0]) + bwipe! + + let dirname .= '/' + + new + redir => msg + exe 'edit' dirname + redir END + call assert_match("is a directory$", split(msg, "\n")[0]) + bwipe! + + call delete(dirname, 'rf') +endfunc + " Test for editing a file using invalid file encoding func Test_edit_invalid_encoding() CheckEnglish diff --git a/src/version.c b/src/version.c index 33d39bdd6..beca185c7 100644 --- a/src/version.c +++ b/src/version.c @@ -751,6 +751,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1793, +/**/ 1792, /**/ 1791, |