file(GLOB) does not escape filenames with semicolons when creating the output variable definition
We recently stumped against an escaping problem in CMake. GLOB
bing a folder to get all filenames creates a list with the wrong number of items if any filename contains semicolons. Things also behave weirdly when square brackets are involved.
To reproduce try the following:
- Create an empty folder
- Run the following:
echo 0 > 'a' echo 1 > 'a b ' echo 2 > 'a;b c' echo 3 > 'a;[;]c' echo 4 > 'a;[;c'
- Use the following CMakeLists.txt in the directory:
cmake_minimum_required(VERSION 3.11) file(GLOB files "a*") message(STATUS " ++++ ${files} ++++") foreach(file IN LISTS files) message(STATUS " ------------- ${file} ------------- ") file(READ "${file}" contents) message("${contents}") endforeach()
The culprit seems to be bool cmFileCommand::HandleGlobCommand(std::vector<std::string> const& args, bool recurse)
. At the end of the method it does: this->Makefile->AddDefinition(variable, cmJoin(files, ";").c_str());
.
The contents of the "files" vector should instead be escaped before joining it.
Edited by Ghost User