Browse Source

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 <[email protected]>
Acked-by: buildbot <[email protected]>
Merge-request: !9015
Brad King 2 years ago
parent
commit
d56de8ae46
2 changed files with 35 additions and 9 deletions
  1. 4 4
      Source/kwsys/SystemTools.cxx
  2. 31 5
      Tests/RunCMake/if/FilePermissions.cmake

+ 4 - 4
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);
   }

+ 31 - 5
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()