summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKWSys Robot <kwrobot@kitware.com>2015-08-03 17:14:14 (GMT)
committerBrad King <brad.king@kitware.com>2015-08-03 17:17:50 (GMT)
commit9a59ae5c198f7c413bcaf29f1ab107a265677b95 (patch)
treec904a09ba88c1f96cfb0886c25a25cb1df019075
parent1feafc643b1c50fd0fa8171a4170065ca39d4d4c (diff)
downloadCMake-9a59ae5c198f7c413bcaf29f1ab107a265677b95.zip
CMake-9a59ae5c198f7c413bcaf29f1ab107a265677b95.tar.gz
CMake-9a59ae5c198f7c413bcaf29f1ab107a265677b95.tar.bz2
KWSys 2015-08-03 (dad68c33)
Extract upstream KWSys using the following shell commands. $ git archive --prefix=upstream-kwsys/ dad68c33 | tar x $ git shortlog --no-merges --abbrev=8 --format='%h %s' f63febb7..dad68c33 James Johnston (1): dad68c33 Encoding: Fix undefined behavior if out of memory. Jean-Christophe Fillion-Robin (2): e5c23738 SystemTools: Fix DetectFileType failure on missing file 6d83c113 SystemTools: Fix DetectFileType failure on directory Sebastian Schuberth (1): 4db8e69f SystemTools: Implement FileIsSymlink on Windows
-rw-r--r--EncodingC.c14
-rw-r--r--SystemTools.cxx18
-rw-r--r--testSystemTools.cxx22
3 files changed, 48 insertions, 6 deletions
diff --git a/EncodingC.c b/EncodingC.c
index ba2cec2..32b9bff 100644
--- a/EncodingC.c
+++ b/EncodingC.c
@@ -45,8 +45,11 @@ wchar_t* kwsysEncoding_DupToWide(const char* str)
if(length > 0)
{
ret = (wchar_t*)malloc((length)*sizeof(wchar_t));
- ret[0] = 0;
- kwsysEncoding_mbstowcs(ret, str, length);
+ if(ret)
+ {
+ ret[0] = 0;
+ kwsysEncoding_mbstowcs(ret, str, length);
+ }
}
return ret;
}
@@ -72,8 +75,11 @@ char* kwsysEncoding_DupToNarrow(const wchar_t* str)
if(length > 0)
{
ret = (char*)malloc(length);
- ret[0] = 0;
- kwsysEncoding_wcstombs(ret, str, length);
+ if(ret)
+ {
+ ret[0] = 0;
+ kwsysEncoding_wcstombs(ret, str, length);
+ }
}
return ret;
}
diff --git a/SystemTools.cxx b/SystemTools.cxx
index 3452259..0714344 100644
--- a/SystemTools.cxx
+++ b/SystemTools.cxx
@@ -3198,8 +3198,16 @@ bool SystemTools::FileIsDirectory(const kwsys_stl::string& inName)
bool SystemTools::FileIsSymlink(const kwsys_stl::string& name)
{
#if defined( _WIN32 )
- (void)name;
- return false;
+ DWORD attr = GetFileAttributesW(
+ SystemTools::ConvertToWindowsExtendedPath(name).c_str());
+ if (attr != INVALID_FILE_ATTRIBUTES)
+ {
+ return (attr & FILE_ATTRIBUTE_REPARSE_POINT) != 0;
+ }
+ else
+ {
+ return false;
+ }
#else
struct stat fs;
if(lstat(name.c_str(), &fs) == 0)
@@ -4230,6 +4238,11 @@ SystemTools::DetectFileType(const char *filename,
return SystemTools::FileTypeUnknown;
}
+ if (SystemTools::FileIsDirectory(filename))
+ {
+ return SystemTools::FileTypeUnknown;
+ }
+
FILE *fp = Fopen(filename, "rb");
if (!fp)
{
@@ -4243,6 +4256,7 @@ SystemTools::DetectFileType(const char *filename,
fclose(fp);
if (read_length == 0)
{
+ delete [] buffer;
return SystemTools::FileTypeUnknown;
}
diff --git a/testSystemTools.cxx b/testSystemTools.cxx
index 15d8eab..7b5c025 100644
--- a/testSystemTools.cxx
+++ b/testSystemTools.cxx
@@ -98,6 +98,10 @@ static bool CheckEscapeChars(kwsys_stl::string input,
static bool CheckFileOperations()
{
bool res = true;
+ const kwsys_stl::string testNonExistingFile(TEST_SYSTEMTOOLS_SOURCE_DIR
+ "/testSystemToolsNonExistingFile");
+ const kwsys_stl::string testDotFile(TEST_SYSTEMTOOLS_SOURCE_DIR
+ "/.");
const kwsys_stl::string testBinFile(TEST_SYSTEMTOOLS_SOURCE_DIR
"/testSystemTools.bin");
const kwsys_stl::string testTxtFile(TEST_SYSTEMTOOLS_SOURCE_DIR
@@ -106,6 +110,24 @@ static bool CheckFileOperations()
"/testSystemToolsNewDir");
const kwsys_stl::string testNewFile(testNewDir + "/testNewFile.txt");
+ if (kwsys::SystemTools::DetectFileType(testNonExistingFile.c_str()) !=
+ kwsys::SystemTools::FileTypeUnknown)
+ {
+ kwsys_ios::cerr
+ << "Problem with DetectFileType - failed to detect type of: "
+ << testNonExistingFile << kwsys_ios::endl;
+ res = false;
+ }
+
+ if (kwsys::SystemTools::DetectFileType(testDotFile.c_str()) !=
+ kwsys::SystemTools::FileTypeUnknown)
+ {
+ kwsys_ios::cerr
+ << "Problem with DetectFileType - failed to detect type of: "
+ << testDotFile << kwsys_ios::endl;
+ res = false;
+ }
+
if (kwsys::SystemTools::DetectFileType(testBinFile.c_str()) !=
kwsys::SystemTools::FileTypeBinary)
{