changeset 22490:23a5977d7211 v8.2.1793

patch 8.2.1793: not consistently giving the "is a directory" warning Commit: https://github.com/vim/vim/commit/c8fe645c198e2ca55c4e3446efbbdb9b995c63ce Author: Bram Moolenaar <Bram@vim.org> Date: Sat Oct 3 17:04:37 2020 +0200 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)
author Bram Moolenaar <Bram@vim.org>
date Sat, 03 Oct 2020 17:15:03 +0200
parents 4dc04bc62557
children 2ebfb710e320
files src/fileio.c src/testdir/test_edit.vim src/version.c
diffstat 3 files changed, 45 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- 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
--- 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
--- 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,