aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Schumacher <roschuma@microsoft.com>2019-03-14 16:55:23 -0700
committerRobert Schumacher <roschuma@microsoft.com>2019-03-14 16:55:23 -0700
commit184fd3a1b1b57720562729906ae341c801382d56 (patch)
tree9b3a771ea253f213cd0125052d00e1679ea8d22e
parent61c6ef26f761dfc784e40f060e3e6581b7d77d6e (diff)
downloadvcpkg-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.cpp32
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