]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 8.2.0947: readdirex() doesn't handle broken link properly v8.2.0947
authorBram Moolenaar <Bram@vim.org>
Wed, 10 Jun 2020 13:55:36 +0000 (15:55 +0200)
committerBram Moolenaar <Bram@vim.org>
Wed, 10 Jun 2020 13:55:36 +0000 (15:55 +0200)
Problem:    Readdirex() doesn't handle broken link properly.
Solution:   Small fixes to readdirex(). (Christian Brabandt, closes #6226,
            closes #6213)

src/fileio.c
src/testdir/test_functions.vim
src/version.c

index 4da3afc5404f83f34bd52ded230a79150023c61d..06a4c51a3a21a7664521e22162a18f56e4b4e420 100644 (file)
@@ -4544,7 +4544,7 @@ create_readdirex_item(char_u *path, char_u *name)
     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_u *name)
     {
        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_u *name)
            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);
index d3bf1db2509af4126ebc673a6d1b1994b6046bb0..f83264b4805e5664448e91fa7747c3fa692eecf1 100644 (file)
@@ -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
 
index bce00b3cb67ce2f7ccbd005bb24c6a9a5a5498a4..b0a0669bbdc318d725e3b73eba95ede812b01b99 100644 (file)
@@ -754,6 +754,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    947,
 /**/
     946,
 /**/