summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorK. R. Walker <tyu@eridex.org>2024-08-19 18:00:18 (GMT)
committerBrad King <brad.king@kitware.com>2024-08-19 18:25:31 (GMT)
commitb1f956529a7abefba03f5902ba187956c730afb9 (patch)
treea8cc30305a05b76c9e5f1a707b019e3ebefe5275
parent97bb92ace5fa26e20a0d0f87131dce9567048985 (diff)
downloadCMake-b1f956529a7abefba03f5902ba187956c730afb9.zip
CMake-b1f956529a7abefba03f5902ba187956c730afb9.tar.gz
CMake-b1f956529a7abefba03f5902ba187956c730afb9.tar.bz2
CPack/NSIS: Fix matching of reserved component names
"Console" unexpectedly matches the reserved name regex. This revealed that `cmCPackNSISGenerator::CreateComponentDescription()` needs to use the name returned by `GetSanitizedDirOrFileName()` for the component file glob. Fix the change from commit a1af593291 (CPack: Support arbitrary component name when packaging, 2024-05-01, v3.30.0-rc1~151^2~1) to address these issues and add related checks to the `CPackNSISGenerator` test case. Issue: #23612
-rw-r--r--Source/CPack/cmCPackGenerator.cxx3
-rw-r--r--Source/CPack/cmCPackNSISGenerator.cxx4
-rw-r--r--Tests/CPackNSISGenerator/CMakeLists.txt20
-rw-r--r--Tests/CPackNSISGenerator/RunCPackVerifyResult.cmake21
4 files changed, 45 insertions, 3 deletions
diff --git a/Source/CPack/cmCPackGenerator.cxx b/Source/CPack/cmCPackGenerator.cxx
index 03b8766..b025570 100644
--- a/Source/CPack/cmCPackGenerator.cxx
+++ b/Source/CPack/cmCPackGenerator.cxx
@@ -1552,6 +1552,7 @@ std::string cmCPackGenerator::GetSanitizedDirOrFileName(
#ifdef _WIN32
// Given name matches a reserved name (on Windows)?
// Then return it prepended with an underscore.
+ // See https://learn.microsoft.com/en-us/windows/win32/fileio/naming-a-file
cmsys::RegularExpression reserved_pattern("^("
"[Cc][Oo][Nn]|"
"[Pp][Rr][Nn]|"
@@ -1559,7 +1560,7 @@ std::string cmCPackGenerator::GetSanitizedDirOrFileName(
"[Nn][Uu][Ll]|"
"[Cc][Oo][Mm][1-9]|"
"[Ll][Pp][Tt][1-9]"
- ")([.].+)?");
+ ")[.]?$");
if (reserved_pattern.find(name)) {
return "_" + name;
}
diff --git a/Source/CPack/cmCPackNSISGenerator.cxx b/Source/CPack/cmCPackNSISGenerator.cxx
index 43b1d76..155bc9e 100644
--- a/Source/CPack/cmCPackNSISGenerator.cxx
+++ b/Source/CPack/cmCPackNSISGenerator.cxx
@@ -863,8 +863,8 @@ std::string cmCPackNSISGenerator::CreateComponentDescription(
/* clang-format on */
componentCode += out.str();
} else {
- componentCode +=
- " File /r \"${INST_DIR}\\" + component->Name + "\\*.*\"\n";
+ componentCode += " File /r \"${INST_DIR}\\" +
+ this->GetSanitizedDirOrFileName(component->Name) + "\\*.*\"\n";
}
componentCode += "SectionEnd\n";
diff --git a/Tests/CPackNSISGenerator/CMakeLists.txt b/Tests/CPackNSISGenerator/CMakeLists.txt
index 5d6320b..cb0b13d 100644
--- a/Tests/CPackNSISGenerator/CMakeLists.txt
+++ b/Tests/CPackNSISGenerator/CMakeLists.txt
@@ -10,6 +10,26 @@ install(TARGETS hello
LIBRARY DESTINATION .
BUNDLE DESTINATION .)
+# Component that is a reserved name on Windows.
+# See https://learn.microsoft.com/en-us/windows/win32/fileio/naming-a-file
+install(
+ DIRECTORY .
+ DESTINATION txt
+ COMPONENT CON
+ FILES_MATCHING PATTERN *.txt)
+# Component name that is similar to a reserved name on Windows.
+install(
+ DIRECTORY .
+ DESTINATION txt
+ COMPONENT Console
+ FILES_MATCHING PATTERN *.txt)
+# Component name that is strongly discouraged on Windows.
+install(
+ DIRECTORY .
+ DESTINATION txt
+ COMPONENT EndsWithDot.
+ FILES_MATCHING PATTERN *.txt)
+
set(CPACK_NSIS_MUI_HEADERIMAGE "${PROJECT_SOURCE_DIR}\\\\header-image.bmp")
set(CPACK_PACKAGE_ICON "${PROJECT_SOURCE_DIR}\\\\header-icon.bmp")
set(CPACK_NSIS_MUI_ICON "${PROJECT_SOURCE_DIR}\\\\install.ico")
diff --git a/Tests/CPackNSISGenerator/RunCPackVerifyResult.cmake b/Tests/CPackNSISGenerator/RunCPackVerifyResult.cmake
index 31a2560..3e4d7b4 100644
--- a/Tests/CPackNSISGenerator/RunCPackVerifyResult.cmake
+++ b/Tests/CPackNSISGenerator/RunCPackVerifyResult.cmake
@@ -69,3 +69,24 @@ if("${output_index}" EQUAL "-1")
else()
message(FATAL_ERROR "License found in the project")
endif()
+
+file(STRINGS "${project_file}" line REGEX [[\\_CON\\]])
+string(FIND "${line}" [[\_CON\]] output_index)
+message(STATUS "Found CON component reserved directory name as _CON")
+if("${output_index}" EQUAL "-1")
+ message(FATAL_ERROR "CON component reserved directory name not found as _CON in the project")
+endif()
+
+file(STRINGS "${project_file}" line REGEX [[\\Console\\]])
+string(FIND "${line}" [[\Console\]] output_index)
+message(STATUS "Found Console component directory name as Console")
+if("${output_index}" EQUAL "-1")
+ message(FATAL_ERROR "Console component directory name not found as Console in the project")
+endif()
+
+file(STRINGS "${project_file}" line REGEX [[\\EndsWithDot._\\]])
+string(FIND "${line}" [[\EndsWithDot._\]] output_index)
+message(STATUS "Found EndsWithDot. component directory name as EndsWithDot._")
+if("${output_index}" EQUAL "-1")
+ message(FATAL_ERROR "EndsWithDot. component directory name not found as EndsWithDot._ in the project")
+endif()