From fb77be5a51732b66234d3d506c040d5c0416a596 Mon Sep 17 00:00:00 2001 From: Clinton Stimpson <clinton@elemtech.com> Date: Mon, 8 Sep 2014 21:24:08 -0600 Subject: [PATCH] SystemTools: Fix GetCasePathName to handle wildcards on Windows. If a passed in filename includes '*' or '?', do not match it with a different file name. Change-Id: I6cfde43a043132ec876e92fad0bef9245a10fa5f --- SystemTools.cxx | 10 ++++++++++ testSystemTools.cxx | 24 ++++++++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/SystemTools.cxx b/SystemTools.cxx index 87fdfbe2..8a61267c 100644 --- a/SystemTools.cxx +++ b/SystemTools.cxx @@ -3536,6 +3536,16 @@ static int GetCasePathName(const kwsys_stl::string & pathIn, kwsys_stl::string test_str = casePath; test_str += path_components[idx]; + // If path component contains wildcards, we skip matching + // because these filenames are not allowed on windows, + // and we do not want to match a different file. + if(path_components[idx].find('*') != kwsys_stl::string::npos || + path_components[idx].find('?') != kwsys_stl::string::npos) + { + casePath = ""; + return 0; + } + WIN32_FIND_DATAW findData; HANDLE hFind = ::FindFirstFileW(Encoding::ToWide(test_str).c_str(), &findData); diff --git a/testSystemTools.cxx b/testSystemTools.cxx index a7cfa0de..b41532b1 100644 --- a/testSystemTools.cxx +++ b/testSystemTools.cxx @@ -589,6 +589,28 @@ static bool CheckRelativePaths() return res; } +static bool CheckCollapsePath( + const kwsys_stl::string& path, + const kwsys_stl::string& expected) +{ + kwsys_stl::string result = kwsys::SystemTools::CollapseFullPath(path); + if(expected != result) + { + kwsys_ios::cerr << "CollapseFullPath(" << path + << ") yielded " << result << " instead of " << expected << kwsys_ios::endl; + return false; + } + return true; +} + +static bool CheckCollapsePath() +{ + bool res = true; + res &= CheckCollapsePath("/usr/share/*", "/usr/share/*"); + res &= CheckCollapsePath("C:/Windows/*", "C:/Windows/*"); + return res; +} + //---------------------------------------------------------------------------- int testSystemTools(int, char*[]) { @@ -622,5 +644,7 @@ int testSystemTools(int, char*[]) res &= CheckRelativePaths(); + res &= CheckCollapsePath(); + return res ? 0 : 1; } -- GitLab