changeset 20790:5a9c42c6a69e v8.2.0947

patch 8.2.0947: readdirex() doesn't handle broken link properly Commit: https://github.com/vim/vim/commit/ab54032f297e9418b0d83970cbe3a414d6ef08c4 Author: Bram Moolenaar <Bram@vim.org> Date: Wed Jun 10 15:55:36 2020 +0200 patch 8.2.0947: readdirex() doesn't handle broken link properly Problem: Readdirex() doesn't handle broken link properly. Solution: Small fixes to readdirex(). (Christian Brabandt, closes https://github.com/vim/vim/issues/6226, closes #6213)
author Bram Moolenaar <Bram@vim.org>
date Wed, 10 Jun 2020 16:00:05 +0200
parents 7177dae667cd
children 1fb35fe14c9a
files src/fileio.c src/testdir/test_functions.vim src/version.c
diffstat 3 files changed, 24 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/src/fileio.c
+++ b/src/fileio.c
@@ -4544,7 +4544,7 @@ create_readdirex_item(char_u *path, char
     int		ret, link = FALSE;
     varnumber_T	size;
     char_u	permbuf[] = "---------";
-    char_u	*q;
+    char_u	*q = NULL;
     struct passwd *pw;
     struct group  *gr;
 
@@ -4563,6 +4563,9 @@ create_readdirex_item(char_u *path, char
     {
 	link = TRUE;
 	ret = mch_stat(p, &st);
+	if (ret < 0)
+	    q = (char_u*)"link";
+
     }
     vim_free(p);
 
@@ -4617,7 +4620,7 @@ create_readdirex_item(char_u *path, char
 	    goto theend;
 	if (dict_add_number(item, "time", -1) == FAIL)
 	    goto theend;
-	if (dict_add_string(item, "type", (char_u*)"") == FAIL)
+	if (dict_add_string(item, "type", q == NULL ? (char_u*)"" : q) == FAIL)
 	    goto theend;
 	if (dict_add_string(item, "perm", (char_u*)"") == FAIL)
 	    goto theend;
@@ -4719,6 +4722,11 @@ readdir_core(
 	    ignore = wp[0] == L'.' &&
 		    (wp[1] == NUL ||
 		     (wp[1] == L'.' && wp[2] == NUL));
+	    if (ignore)
+	    {
+		ok = FindNextFileW(hFind, &wfd);
+		continue;
+	    }
 #  ifdef FEAT_EVAL
 	    if (withattr)
 		item = (void*)create_readdirex_item(&wfd);
@@ -4787,6 +4795,8 @@ readdir_core(
 	    ignore = p[0] == '.' &&
 		    (p[1] == NUL ||
 		     (p[1] == '.' && p[2] == NUL));
+	    if (ignore)
+		continue;
 #  ifdef FEAT_EVAL
 	    if (withattr)
 		item = (void*)create_readdirex_item(path, p);
--- a/src/testdir/test_functions.vim
+++ b/src/testdir/test_functions.vim
@@ -1912,6 +1912,16 @@ func Test_readdirex()
 			  \ ->map({-> v:val.name})
   call sort(files)->assert_equal(['bar.txt', 'dir', 'foo.txt'])
 
+  " report brocken link correctly
+  if has("unix")
+    call writefile([], 'Xdir/abc.txt')
+    call system("ln -s Xdir/abc.txt Xdir/link")
+    call delete('Xdir/abc.txt')
+    let files = readdirex('Xdir', 'readdirex("Xdir", "1") != []')
+			  \ ->map({-> v:val.name .. '_' .. v:val.type})
+    call sort(files)->assert_equal(
+        \ ['bar.txt_file', 'dir_dir', 'foo.txt_file', 'link_link'])
+  endif
   eval 'Xdir'->delete('rf')
 endfunc
 
--- a/src/version.c
+++ b/src/version.c
@@ -755,6 +755,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    947,
+/**/
     946,
 /**/
     945,