vim-patch:8.2.1793: not consistently giving the "is a directory" warning

Problem:    Not consistently giving the "is a directory" warning.
Solution:   Adjust check for illegal file name and directory. (Yasuhiro
            Matsumoto, closes vim/vim#7067)
c8fe645c19
This commit is contained in:
Shougo Matsushita
2020-10-04 11:34:50 +09:00
parent f6ac375604
commit 0f078bdde8
3 changed files with 61 additions and 6 deletions

View File

@@ -350,6 +350,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
@@ -444,16 +445,27 @@ readfile(
else
msg_scroll = TRUE; /* don't overwrite previous file message */
/*
* If the name is too long we might crash further on, quit here.
*/
// If the name is too long we might crash further on, quit here.
if (fname != NULL && *fname != NUL) {
if (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((const char *)fname, (const char *)(fname + namelen))) {
filemess(curbuf, fname, (char_u *)_(msg_is_a_directory), 0);
msg_end();
msg_scroll = msg_save;
return FAIL;
}
}
if (!read_buffer && !read_stdin && !read_fifo) {
@@ -474,7 +486,7 @@ readfile(
# endif
) {
if (S_ISDIR(perm)) {
filemess(curbuf, fname, (char_u *)_("is a directory"), 0);
filemess(curbuf, fname, (char_u *)_(msg_is_a_directory), 0);
} else {
filemess(curbuf, fname, (char_u *)_("is not a file"), 0);
}
@@ -544,7 +556,7 @@ readfile(
#ifndef UNIX
// On non-unix systems we can't open a directory, check here.
if (os_isdir(fname)) {
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 {
#endif