mirror of
https://github.com/Kitware/CMake.git
synced 2026-05-12 17:19:05 -05:00
Merge topic 'remove-non-readable-dir'
9718c312b6Tests: Avoid leaving behind non-readable directories2e82ba70b3Tests: Avoid creating world-writable paths5589bcb1bfTests: Fix directory removal in RunCMake.if test165bf3252fMerge branch 'upstream-KWSys' into remove-write-only-dir22a759b5b5KWSys 2023-11-29 (433f3d23) Acked-by: Kitware Robot <kwrobot@kitware.com> Acked-by: buildbot <buildbot@kitware.com> Merge-request: !9015
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user