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
This commit is contained in:
Brad King
2019-05-21 09:20:01 -04:00
parent 1db0edb2a6
commit a1eb03569d
6 changed files with 29 additions and 1 deletions

View File

@@ -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:

View File

@@ -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.

View File

@@ -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;

View File

@@ -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.$

View File

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

View File

@@ -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)