# HG changeset patch # User Bram Moolenaar # Date 1591797605 -7200 # Node ID 5a9c42c6a69e69c8cc60197ece025e9fffa4703d # Parent 7177dae667cdd95f6f44abb2e57ac536799ab043 patch 8.2.0947: readdirex() doesn't handle broken link properly Commit: https://github.com/vim/vim/commit/ab54032f297e9418b0d83970cbe3a414d6ef08c4 Author: Bram Moolenaar 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) diff --git a/src/fileio.c b/src/fileio.c --- 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); diff --git a/src/testdir/test_functions.vim b/src/testdir/test_functions.vim --- 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 diff --git a/src/version.c b/src/version.c --- 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,