Commit c6f8e24a authored by Brad King's avatar Brad King
Browse files

SystemTools: Fix CollapseFullPath with relative base path

Although `CollapseFullPath` is meant to construct a full path, it
is possible that a caller will provide a relative base path.
In this case, keep leading `../` components from the base path
instead of discarding them.
parent 15896025
......@@ -3394,8 +3394,13 @@ static void SystemToolsAppendComponents(
static const std::string cur = ".";
for (std::vector<std::string>::const_iterator i = first; i != last; ++i) {
if (*i == up) {
if (out_components.size() > 1) {
// Remove the previous component if possible. Ignore ../ components
// that try to go above the root. Keep ../ components if they are
// at the beginning of a relative path (base path is relative).
if (out_components.size() > 1 && out_components.back() != up) {
out_components.resize(out_components.size() - 1);
} else if (!out_components.empty() && out_components[0].empty()) {
out_components.emplace_back(std::move(*i));
}
} else if (!i->empty() && *i != cur) {
out_components.emplace_back(std::move(*i));
......
......@@ -684,9 +684,10 @@ static bool CheckRelativePaths()
}
static bool CheckCollapsePath(const std::string& path,
const std::string& expected)
const std::string& expected,
const char* base = nullptr)
{
std::string result = kwsys::SystemTools::CollapseFullPath(path);
std::string result = kwsys::SystemTools::CollapseFullPath(path, base);
if (!kwsys::SystemTools::ComparePath(expected, result)) {
std::cerr << "CollapseFullPath(" << path << ") yielded " << result
<< " instead of " << expected << std::endl;
......@@ -710,6 +711,9 @@ static bool CheckCollapsePath()
res &= CheckCollapsePath("C:/", "C:/");
res &= CheckCollapsePath("C:/../", "C:/");
res &= CheckCollapsePath("C:/../../", "C:/");
res &= CheckCollapsePath("../b", "../../b", "../");
res &= CheckCollapsePath("../a/../b", "../b", "../rel");
res &= CheckCollapsePath("a/../b", "../rel/b", "../rel");
return res;
}
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment