From 184fd3a1b1b57720562729906ae341c801382d56 Mon Sep 17 00:00:00 2001 From: Robert Schumacher Date: Thu, 14 Mar 2019 16:55:23 -0700 Subject: [vcpkg] Fix infinite loop bug on certain filesystem implementations when searching up --- toolsrc/src/vcpkg/base/files.cpp | 32 ++++++++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-) (limited to 'toolsrc/src') 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 get_files_recursive(const fs::path& dir) const override -- cgit v1.2.3