diff options
| author | Robert Schumacher <roschuma@microsoft.com> | 2019-03-14 16:55:23 -0700 |
|---|---|---|
| committer | Robert Schumacher <roschuma@microsoft.com> | 2019-03-14 16:55:23 -0700 |
| commit | 184fd3a1b1b57720562729906ae341c801382d56 (patch) | |
| tree | 9b3a771ea253f213cd0125052d00e1679ea8d22e | |
| parent | 61c6ef26f761dfc784e40f060e3e6581b7d77d6e (diff) | |
| download | vcpkg-184fd3a1b1b57720562729906ae341c801382d56.tar.gz vcpkg-184fd3a1b1b57720562729906ae341c801382d56.zip | |
[vcpkg] Fix infinite loop bug on certain filesystem implementations when searching up
| -rw-r--r-- | toolsrc/src/vcpkg/base/files.cpp | 32 |
1 files changed, 28 insertions, 4 deletions
diff --git a/toolsrc/src/vcpkg/base/files.cpp b/toolsrc/src/vcpkg/base/files.cpp index 1740b6f6d..34a6489a8 100644 --- a/toolsrc/src/vcpkg/base/files.cpp +++ b/toolsrc/src/vcpkg/base/files.cpp @@ -71,18 +71,42 @@ namespace vcpkg::Files virtual fs::path find_file_recursively_up(const fs::path& starting_dir, const std::string& filename) const override { - static const fs::path UNIX_ROOT = "/"; fs::path current_dir = starting_dir; - for (; !current_dir.empty() && current_dir != UNIX_ROOT; current_dir = current_dir.parent_path()) + if (exists(current_dir / filename)) { + return current_dir; + } + + int counter = 10000; + for (;;) + { + // This is a workaround for VS2015's experimental filesystem implementation + if (!current_dir.has_relative_path()) + { + current_dir.clear(); + return current_dir; + } + + auto parent = current_dir.parent_path(); + if (parent == current_dir) + { + current_dir.clear(); + return current_dir; + } + + current_dir = std::move(parent); + const fs::path candidate = current_dir / filename; if (exists(candidate)) { return current_dir; } - } - return fs::path(); + --counter; + Checks::check_exit(VCPKG_LINE_INFO, + counter > 0, + "infinite loop encountered while trying to find_file_recursively_up()"); + } } virtual std::vector<fs::path> get_files_recursive(const fs::path& dir) const override |
