diff options
author | Brad King <brad.king@kitware.com> | 2023-11-30 14:06:51 (GMT) |
---|---|---|
committer | Kitware Robot <kwrobot@kitware.com> | 2023-11-30 14:07:02 (GMT) |
commit | d56de8ae4658cf40ebb9070aa39df8722e877062 (patch) | |
tree | 13315dde9917caef3fbe666fe1f9aa73252575da | |
parent | c6504b3c61a7a43ca3d9748bffc650507ef586f8 (diff) | |
parent | 9718c312b60e294603c3c352970be3b4c5011877 (diff) | |
download | CMake-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.cxx | 8 | ||||
-rw-r--r-- | Tests/RunCMake/if/FilePermissions.cmake | 36 |
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() |