1
0
forked from aniani/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 #7067)
This commit is contained in:
Bram Moolenaar 2020-10-03 17:04:37 +02:00
parent 588d241d44
commit c8fe645c19
3 changed files with 45 additions and 10 deletions

View File

@ -211,6 +211,7 @@ readfile(
char_u *old_b_fname; char_u *old_b_fname;
int using_b_ffname; int using_b_ffname;
int using_b_fname; int using_b_fname;
static char *msg_is_a_directory = N_("is a directory");
au_did_filetype = FALSE; // reset before triggering any autocommands au_did_filetype = FALSE; // reset before triggering any autocommands
@ -310,22 +311,29 @@ readfile(
else else
msg_scroll = TRUE; // don't overwrite previous file message 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) if (fname != NULL && *fname != NUL)
{ {
p = fname + STRLEN(fname); size_t namelen = STRLEN(fname);
if (after_pathsep(fname, p) || STRLEN(fname) >= MAXPATHL)
// 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); filemess(curbuf, fname, (char_u *)_("Illegal file name"), 0);
msg_end(); msg_end();
msg_scroll = msg_save; msg_scroll = msg_save;
return FAIL; 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) if (!read_stdin && !read_buffer && !read_fifo)
@ -349,7 +357,7 @@ readfile(
if (S_ISDIR(perm)) 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; retval = NOTDONE;
} }
else else
@ -475,7 +483,7 @@ readfile(
perm = mch_getperm(fname); // check if the file exists perm = mch_getperm(fname); // check if the file exists
if (isdir_f) 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 curbuf->b_p_ro = TRUE; // must use "w!" now
} }
else else

View File

@ -1587,6 +1587,31 @@ func Test_edit_illegal_filename()
close! close!
endfunc 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 " Test for editing a file using invalid file encoding
func Test_edit_invalid_encoding() func Test_edit_invalid_encoding()
CheckEnglish CheckEnglish

View File

@ -750,6 +750,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
1793,
/**/ /**/
1792, 1792,
/**/ /**/