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