summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2023-11-30 14:06:51 (GMT)
committerKitware Robot <kwrobot@kitware.com>2023-11-30 14:07:02 (GMT)
commitd56de8ae4658cf40ebb9070aa39df8722e877062 (patch)
tree13315dde9917caef3fbe666fe1f9aa73252575da
parentc6504b3c61a7a43ca3d9748bffc650507ef586f8 (diff)
parent9718c312b60e294603c3c352970be3b4c5011877 (diff)
downloadCMake-d56de8ae4658cf40ebb9070aa39df8722e877062.zip
CMake-d56de8ae4658cf40ebb9070aa39df8722e877062.tar.gz
CMake-d56de8ae4658cf40ebb9070aa39df8722e877062.tar.bz2
Merge topic 'remove-non-readable-dir'
9718c312b6 Tests: Avoid leaving behind non-readable directories 2e82ba70b3 Tests: Avoid creating world-writable paths 5589bcb1bf Tests: Fix directory removal in RunCMake.if test 165bf3252f Merge branch 'upstream-KWSys' into remove-write-only-dir 22a759b5b5 KWSys 2023-11-29 (433f3d23) Acked-by: Kitware Robot <kwrobot@kitware.com> Acked-by: buildbot <buildbot@kitware.com> Merge-request: !9015
-rw-r--r--Source/kwsys/SystemTools.cxx8
-rw-r--r--Tests/RunCMake/if/FilePermissions.cmake36
2 files changed, 35 insertions, 9 deletions
diff --git a/Source/kwsys/SystemTools.cxx b/Source/kwsys/SystemTools.cxx
index cefb922..53b55f6 100644
--- a/Source/kwsys/SystemTools.cxx
+++ b/Source/kwsys/SystemTools.cxx
@@ -2794,14 +2794,14 @@ Status SystemTools::RemoveFile(std::string const& source)
Status SystemTools::RemoveADirectory(std::string const& source)
{
- // Add write permission to the directory so we can modify its
- // content to remove files and directories from it.
+ // Add read and write permission to the directory so we can read
+ // and modify its content to remove files and directories from it.
mode_t mode = 0;
if (SystemTools::GetPermissions(source, mode)) {
#if defined(_WIN32) && !defined(__CYGWIN__)
- mode |= S_IWRITE;
+ mode |= S_IREAD | S_IWRITE;
#else
- mode |= S_IWUSR;
+ mode |= S_IRUSR | S_IWUSR;
#endif
SystemTools::SetPermissions(source, mode);
}
diff --git a/Tests/RunCMake/if/FilePermissions.cmake b/Tests/RunCMake/if/FilePermissions.cmake
index 7881b5f..9edbddb 100644
--- a/Tests/RunCMake/if/FilePermissions.cmake
+++ b/Tests/RunCMake/if/FilePermissions.cmake
@@ -7,54 +7,69 @@ file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/readable.txt" "foo")
file(CHMOD "${CMAKE_CURRENT_BINARY_DIR}/readable.txt" PERMISSIONS OWNER_READ GROUP_READ WORLD_READ)
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/writable.txt" "foo")
-file(CHMOD "${CMAKE_CURRENT_BINARY_DIR}/writable.txt" PERMISSIONS OWNER_WRITE GROUP_WRITE WORLD_WRITE)
+file(CHMOD "${CMAKE_CURRENT_BINARY_DIR}/writable.txt" PERMISSIONS OWNER_WRITE GROUP_WRITE)
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/executable.txt" "foo")
file(CHMOD "${CMAKE_CURRENT_BINARY_DIR}/executable.txt" PERMISSIONS OWNER_EXECUTE GROUP_EXECUTE WORLD_EXECUTE)
if(NOT WIN32)
- file(REMOVE "${CMAKE_CURRENT_BINARY_DIR}/readable-dir"
- "${CMAKE_CURRENT_BINARY_DIR}/writable-dir"
- "${CMAKE_CURRENT_BINARY_DIR}/executable-dir")
+ file(REMOVE_RECURSE
+ "${CMAKE_CURRENT_BINARY_DIR}/readable-dir"
+ "${CMAKE_CURRENT_BINARY_DIR}/writable-dir"
+ "${CMAKE_CURRENT_BINARY_DIR}/executable-dir"
+ )
file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/readable-dir")
file(CHMOD "${CMAKE_CURRENT_BINARY_DIR}/readable-dir" PERMISSIONS OWNER_READ GROUP_READ WORLD_READ)
file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/writable-dir")
- file(CHMOD "${CMAKE_CURRENT_BINARY_DIR}/writable-dir" PERMISSIONS OWNER_WRITE GROUP_WRITE WORLD_WRITE)
+ file(CHMOD "${CMAKE_CURRENT_BINARY_DIR}/writable-dir" PERMISSIONS OWNER_WRITE GROUP_WRITE)
file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/executable-dir")
file(CHMOD "${CMAKE_CURRENT_BINARY_DIR}/executable-dir" PERMISSIONS OWNER_EXECUTE GROUP_EXECUTE WORLD_EXECUTE)
endif()
+function(cleanup)
+ if(NOT WIN32)
+ # CMake versions prior to 3.29 did not know how to remove non-readable directories.
+ file(CHMOD "${CMAKE_CURRENT_BINARY_DIR}/writable-dir" PERMISSIONS OWNER_READ OWNER_WRITE GROUP_WRITE)
+ file(CHMOD "${CMAKE_CURRENT_BINARY_DIR}/executable-dir" PERMISSIONS OWNER_READ OWNER_EXECUTE GROUP_EXECUTE WORLD_EXECUTE)
+ endif()
+endfunction()
+
if(WIN32)
# files are always readable and executable
# directories are always, readable, writable and executable
if(NOT IS_READABLE "${CMAKE_CURRENT_BINARY_DIR}/readable.txt"
OR IS_WRITABLE "${CMAKE_CURRENT_BINARY_DIR}/readable.txt")
+ cleanup()
message(FATAL_ERROR "checks on \"${CMAKE_CURRENT_BINARY_DIR}/readable.txt\" failed")
endif()
if(NOT IS_EXECUTABLE "${CMAKE_CURRENT_BINARY_DIR}/executable.txt"
OR IS_WRITABLE "${CMAKE_CURRENT_BINARY_DIR}/executable.txt")
+ cleanup()
message(FATAL_ERROR "checks on \"${CMAKE_CURRENT_BINARY_DIR}/executable.txt\" failed")
endif()
else()
if(NOT IS_READABLE "${CMAKE_CURRENT_BINARY_DIR}/readable.txt"
OR IS_WRITABLE "${CMAKE_CURRENT_BINARY_DIR}/readable.txt"
OR IS_EXECUTABLE "${CMAKE_CURRENT_BINARY_DIR}/readable.txt")
+ cleanup()
message(FATAL_ERROR "checks on \"${CMAKE_CURRENT_BINARY_DIR}/readable.txt\" failed")
endif()
if(NOT IS_WRITABLE "${CMAKE_CURRENT_BINARY_DIR}/writable.txt"
OR IS_READABLE "${CMAKE_CURRENT_BINARY_DIR}/writable.txt"
OR IS_EXECUTABLE "${CMAKE_CURRENT_BINARY_DIR}/writable.txt")
+ cleanup()
message(FATAL_ERROR "checks on \"${CMAKE_CURRENT_BINARY_DIR}/writable.txt\" failed")
endif()
if(NOT IS_EXECUTABLE "${CMAKE_CURRENT_BINARY_DIR}/executable.txt"
OR IS_READABLE "${CMAKE_CURRENT_BINARY_DIR}/executable.txt"
OR IS_WRITABLE "${CMAKE_CURRENT_BINARY_DIR}/executable.txt")
+ cleanup()
message(FATAL_ERROR "checks on \"${CMAKE_CURRENT_BINARY_DIR}/executable.txt\" failed")
endif()
@@ -62,18 +77,21 @@ else()
if(NOT IS_READABLE "${CMAKE_CURRENT_BINARY_DIR}/readable-dir"
OR IS_WRITABLE "${CMAKE_CURRENT_BINARY_DIR}/readable-dir"
OR IS_EXECUTABLE "${CMAKE_CURRENT_BINARY_DIR}/readable-dir")
+ cleanup()
message(FATAL_ERROR "checks on \"${CMAKE_CURRENT_BINARY_DIR}/readable-dir\" failed")
endif()
if(NOT IS_WRITABLE "${CMAKE_CURRENT_BINARY_DIR}/writable-dir"
OR IS_READABLE "${CMAKE_CURRENT_BINARY_DIR}/writable-dir"
OR IS_EXECUTABLE "${CMAKE_CURRENT_BINARY_DIR}/writable-dir")
+ cleanup()
message(FATAL_ERROR "checks on \"${CMAKE_CURRENT_BINARY_DIR}/writable-dir\" failed")
endif()
if(NOT IS_EXECUTABLE "${CMAKE_CURRENT_BINARY_DIR}/executable-dir"
OR IS_READABLE "${CMAKE_CURRENT_BINARY_DIR}/executable-dir"
OR IS_WRITABLE "${CMAKE_CURRENT_BINARY_DIR}/executable-dir")
+ cleanup()
message(FATAL_ERROR "checks on \"${CMAKE_CURRENT_BINARY_DIR}/executable.txt\" failed")
endif()
endif()
@@ -117,18 +135,21 @@ if(UNIX)
if(NOT IS_READABLE "${CMAKE_CURRENT_BINARY_DIR}/link-to-readable.txt"
OR IS_WRITABLE "${CMAKE_CURRENT_BINARY_DIR}/link-to-readable.txt"
OR IS_EXECUTABLE "${CMAKE_CURRENT_BINARY_DIR}/link-to-readable.txt")
+ cleanup()
message(FATAL_ERROR "checks on \"${CMAKE_CURRENT_BINARY_DIR}/link-to-readable.txt\" failed")
endif()
if(NOT IS_WRITABLE "${CMAKE_CURRENT_BINARY_DIR}/link-to-writable.txt"
OR IS_READABLE "${CMAKE_CURRENT_BINARY_DIR}/link-to-writable.txt"
OR IS_EXECUTABLE "${CMAKE_CURRENT_BINARY_DIR}/link-to-writable.txt")
+ cleanup()
message(FATAL_ERROR "checks on \"${CMAKE_CURRENT_BINARY_DIR}/link-to-writable.txt\" failed")
endif()
if(NOT IS_EXECUTABLE "${CMAKE_CURRENT_BINARY_DIR}/link-to-executable.txt"
OR IS_READABLE "${CMAKE_CURRENT_BINARY_DIR}/link-to-executable.txt"
OR IS_WRITABLE "${CMAKE_CURRENT_BINARY_DIR}/link-to-executable.txt")
+ cleanup()
message(FATAL_ERROR "checks on \"${CMAKE_CURRENT_BINARY_DIR}/link-to-executable.txt\" failed")
endif()
@@ -136,18 +157,23 @@ if(UNIX)
if(NOT IS_READABLE "${CMAKE_CURRENT_BINARY_DIR}/link-to-readable-dir"
OR IS_WRITABLE "${CMAKE_CURRENT_BINARY_DIR}/link-to-readable-dir"
OR IS_EXECUTABLE "${CMAKE_CURRENT_BINARY_DIR}/link-to-readable-dir")
+ cleanup()
message(FATAL_ERROR "checks on \"${CMAKE_CURRENT_BINARY_DIR}/link-to-readable-dir\" failed")
endif()
if(NOT IS_WRITABLE "${CMAKE_CURRENT_BINARY_DIR}/link-to-writable-dir"
OR IS_READABLE "${CMAKE_CURRENT_BINARY_DIR}/link-to-writable-dir"
OR IS_EXECUTABLE "${CMAKE_CURRENT_BINARY_DIR}/link-to-writable-dir")
+ cleanup()
message(FATAL_ERROR "checks on \"${CMAKE_CURRENT_BINARY_DIR}/link-to-writable-dir\" failed")
endif()
if(NOT IS_EXECUTABLE "${CMAKE_CURRENT_BINARY_DIR}/link-to-executable-dir"
OR IS_READABLE "${CMAKE_CURRENT_BINARY_DIR}/link-to-executable-dir"
OR IS_WRITABLE "${CMAKE_CURRENT_BINARY_DIR}/link-to-executable-dir")
+ cleanup()
message(FATAL_ERROR "checks on \"${CMAKE_CURRENT_BINARY_DIR}/link-to-executable-dir\" failed")
endif()
endif()
+
+cleanup()