jasonmolenda created this revision. jasonmolenda added a reviewer: JDevlieghere. jasonmolenda added a project: LLDB. Herald added a project: All. jasonmolenda requested review of this revision. Herald added a subscriber: lldb-commits.
EnumerateDirectory gets the vfs::Status of each file entry, to check if we are asked to report on this file type, and if we can't get the Status, it stops the directory search. Instead, if it can't get the Status of a directory entry, it should skip that entry and continue searching. This happens with a broken symlink - the link points to another file, but that file doesn't exist, and the Status returned is of the destination file. When we can't get the destination file Status, an error code is returned. Add a test case to FileSystemTests unittest. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D153822 Files: lldb/source/Host/common/FileSystem.cpp lldb/unittests/Host/FileSystemTest.cpp Index: lldb/unittests/Host/FileSystemTest.cpp =================================================================== --- lldb/unittests/Host/FileSystemTest.cpp +++ lldb/unittests/Host/FileSystemTest.cpp @@ -51,6 +51,11 @@ FilesAndDirs.find(Path.str()); if (I == FilesAndDirs.end()) return make_error_code(llvm::errc::no_such_file_or_directory); + // simulate a broken symlink, where it points to a file/dir that + // does not exist. + if (I->second.isSymlink() && + I->second.getPermissions() == sys::fs::perms::no_perms) + return std::error_code(ENOENT, std::generic_category()); return I->second; } ErrorOr<std::unique_ptr<vfs::File>> @@ -152,6 +157,13 @@ sys::fs::file_type::symlink_file, sys::fs::all_all); addEntry(Path, S); } + + void addBrokenSymlink(StringRef Path) { + vfs::Status S(Path, UniqueID(FSID, FileID++), + std::chrono::system_clock::now(), 0, 0, 0, + sys::fs::file_type::symlink_file, sys::fs::no_perms); + addEntry(Path, S); + } }; } // namespace @@ -178,6 +190,7 @@ D->addRegularFile("/foo"); D->addDirectory("/bar"); D->addSymlink("/baz"); + D->addBrokenSymlink("/lux"); D->addRegularFile("/qux", ~sys::fs::perms::all_read); D->setCurrentWorkingDirectory("/"); return D; Index: lldb/source/Host/common/FileSystem.cpp =================================================================== --- lldb/source/Host/common/FileSystem.cpp +++ lldb/source/Host/common/FileSystem.cpp @@ -192,7 +192,7 @@ const auto &Item = *Iter; ErrorOr<vfs::Status> Status = m_fs->status(Item.path()); if (!Status) - break; + continue; if (!find_files && Status->isRegularFile()) continue; if (!find_directories && Status->isDirectory())
Index: lldb/unittests/Host/FileSystemTest.cpp =================================================================== --- lldb/unittests/Host/FileSystemTest.cpp +++ lldb/unittests/Host/FileSystemTest.cpp @@ -51,6 +51,11 @@ FilesAndDirs.find(Path.str()); if (I == FilesAndDirs.end()) return make_error_code(llvm::errc::no_such_file_or_directory); + // simulate a broken symlink, where it points to a file/dir that + // does not exist. + if (I->second.isSymlink() && + I->second.getPermissions() == sys::fs::perms::no_perms) + return std::error_code(ENOENT, std::generic_category()); return I->second; } ErrorOr<std::unique_ptr<vfs::File>> @@ -152,6 +157,13 @@ sys::fs::file_type::symlink_file, sys::fs::all_all); addEntry(Path, S); } + + void addBrokenSymlink(StringRef Path) { + vfs::Status S(Path, UniqueID(FSID, FileID++), + std::chrono::system_clock::now(), 0, 0, 0, + sys::fs::file_type::symlink_file, sys::fs::no_perms); + addEntry(Path, S); + } }; } // namespace @@ -178,6 +190,7 @@ D->addRegularFile("/foo"); D->addDirectory("/bar"); D->addSymlink("/baz"); + D->addBrokenSymlink("/lux"); D->addRegularFile("/qux", ~sys::fs::perms::all_read); D->setCurrentWorkingDirectory("/"); return D; Index: lldb/source/Host/common/FileSystem.cpp =================================================================== --- lldb/source/Host/common/FileSystem.cpp +++ lldb/source/Host/common/FileSystem.cpp @@ -192,7 +192,7 @@ const auto &Item = *Iter; ErrorOr<vfs::Status> Status = m_fs->status(Item.path()); if (!Status) - break; + continue; if (!find_files && Status->isRegularFile()) continue; if (!find_directories && Status->isDirectory())
_______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits