From 60db2715b7a5356a102d80bb22a3add834b00a53 Mon Sep 17 00:00:00 2001 From: slavek-kucera <53339291+slavek-kucera@users.noreply.github.com> Date: Thu, 4 Nov 2021 15:29:23 +0100 Subject: [PATCH] fix: Language server crashes while trying to list inaccessible directory --- utils/src/native_path.cpp | 36 +++++++++++++++++++++--------------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/utils/src/native_path.cpp b/utils/src/native_path.cpp index 943db521b..6e5f26f90 100644 --- a/utils/src/native_path.cpp +++ b/utils/src/native_path.cpp @@ -42,21 +42,27 @@ std::filesystem::path canonical(const std::filesystem::path& p, std::error_code& } bool equal(const std::filesystem::path& left, const std::filesystem::path& right) { return left == right; } -bool is_directory(const std::filesystem::path& p) { return std::filesystem::directory_entry(p).is_directory(); } +bool is_directory(const std::filesystem::path& p) +{ + std::error_code ec; + std::filesystem::directory_entry d(p, ec); + + return !ec && d.is_directory(); +} list_directory_rc list_directory_regular_files( const std::filesystem::path& d, std::function h) { - std::filesystem::directory_entry dir(d); + try + { + std::filesystem::directory_entry dir(d); - if (!dir.exists()) - return list_directory_rc::not_exists; + if (!dir.exists()) + return list_directory_rc::not_exists; - if (!dir.is_directory()) - return list_directory_rc::not_a_directory; + if (!dir.is_directory()) + return list_directory_rc::not_a_directory; - try - { std::filesystem::directory_iterator it(dir); for (auto& p : it) @@ -78,16 +84,16 @@ list_directory_rc list_directory_regular_files( list_directory_rc list_directory_subdirs_and_symlinks( const std::filesystem::path& d, std::function h) { - std::filesystem::directory_entry dir(d); + try + { + std::filesystem::directory_entry dir(d); - if (!dir.exists()) - return list_directory_rc::not_exists; + if (!dir.exists()) + return list_directory_rc::not_exists; - if (!dir.is_directory()) - return list_directory_rc::not_a_directory; + if (!dir.is_directory()) + return list_directory_rc::not_a_directory; - try - { std::filesystem::directory_iterator it(dir); for (auto& p : it)