Преглед на файлове

file: Change REMOVE to ignore empty names

Previously code like

    file(REMOVE_RECURSE "${accidentally_missing_variable}")

treated the empty string as a relative path with respect to the
current directory and removed its contents.  Change this behavior
to ignore the empty string with a warning instead.

Normally such behavior changes are done with a policy, but in this case
such code is likely a real bug in project code that can delete data.

Fixes: #19274
Brad King преди 6 години
родител
ревизия
a1eb03569d

+ 2 - 1
Help/command/file.rst

@@ -292,7 +292,8 @@ Move a file or directory within a filesystem from ``<oldname>`` to
 
 Remove the given files.  The ``REMOVE_RECURSE`` mode will remove the given
 files and directories, also non-empty directories. No error is emitted if a
-given file does not exist.
+given file does not exist.  Relative input paths are evaluated with respect
+to the current source directory.  Empty input paths are ignored with a warning.
 
 .. _MAKE_DIRECTORY:
 

+ 6 - 0
Help/release/dev/file-remove-no-empty.rst

@@ -0,0 +1,6 @@
+file-remove-no-empty
+--------------------
+
+* The :command:`file(REMOVE)` and :command:`file(REMOVE_RECURSE)` commands
+  were changed to ignore empty arguments with a warning instead of treating
+  them as a relative path and removing the contents of the current directory.

+ 6 - 0
Source/cmFileCommand.cxx

@@ -1405,6 +1405,12 @@ bool cmFileCommand::HandleRemove(std::vector<std::string> const& args,
        cmMakeRange(args).advance(1)) // Get rid of subcommand
   {
     std::string fileName = arg;
+    if (fileName.empty()) {
+      std::string const r = recurse ? "REMOVE_RECURSE" : "REMOVE";
+      this->Makefile->IssueMessage(MessageType::AUTHOR_WARNING,
+                                   "Ignoring empty file name in " + r + ".");
+      continue;
+    }
     if (!cmsys::SystemTools::FileIsFullPath(fileName)) {
       fileName = this->Makefile->GetCurrentSourceDirectory();
       fileName += "/" + arg;

+ 11 - 0
Tests/RunCMake/file/REMOVE-empty-stderr.txt

@@ -0,0 +1,11 @@
+^CMake Warning \(dev\) at REMOVE-empty.cmake:1 \(file\):
+  Ignoring empty file name in REMOVE.
+Call Stack \(most recent call first\):
+  CMakeLists.txt:[0-9] \(include\)
+This warning is for project developers.  Use -Wno-dev to suppress it.
++
+CMake Warning \(dev\) at REMOVE-empty.cmake:2 \(file\):
+  Ignoring empty file name in REMOVE_RECURSE.
+Call Stack \(most recent call first\):
+  CMakeLists.txt:[0-9] \(include\)
+This warning is for project developers.  Use -Wno-dev to suppress it.$

+ 2 - 0
Tests/RunCMake/file/REMOVE-empty.cmake

@@ -0,0 +1,2 @@
+file(REMOVE "")
+file(REMOVE_RECURSE "")

+ 2 - 0
Tests/RunCMake/file/RunCMakeTest.cmake

@@ -43,6 +43,8 @@ run_cmake(GLOB_RECURSE-noexp-FOLLOW_SYMLINKS)
 run_cmake(SIZE)
 run_cmake(SIZE-error-does-not-exist)
 
+run_cmake(REMOVE-empty)
+
 # tests are valid both for GLOB and GLOB_RECURSE
 run_cmake(GLOB-sort-dedup)
 run_cmake(GLOB-error-LIST_DIRECTORIES-not-boolean)