diff options
author | Ben Boeckel <ben.boeckel@kitware.com> | 2017-07-18 15:08:10 (GMT) |
---|---|---|
committer | Ben Boeckel <ben.boeckel@kitware.com> | 2017-07-21 13:09:56 (GMT) |
commit | b7941641430feeefadc6f16e2cecf6b50bd9fbe3 (patch) | |
tree | 0cd3337f4b799631752d94f3110c6943cd792ecd /Source/cmStringCommand.cxx | |
parent | ec049641c46eb788b25713e5d96ff32c89f0e819 (diff) | |
download | CMake-b7941641430feeefadc6f16e2cecf6b50bd9fbe3.zip CMake-b7941641430feeefadc6f16e2cecf6b50bd9fbe3.tar.gz CMake-b7941641430feeefadc6f16e2cecf6b50bd9fbe3.tar.bz2 |
cmStringCommand: clear intermediate matches
When `string(REGEX REPLACE)` or `string(REGEX MATCHALL)` loop
internally, they store their matches, but they do not clear the previous
match from an earlier iteration. This can leave the contents of
`CMAKE_MATCH_<N>` with bogus values for later matches in the string if
they have groups which earlier matched a non-empty string, but now match
an empty string.
Fixes #17079.
Diffstat (limited to 'Source/cmStringCommand.cxx')
-rw-r--r-- | Source/cmStringCommand.cxx | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/Source/cmStringCommand.cxx b/Source/cmStringCommand.cxx index 7a097ba..5a6cf48 100644 --- a/Source/cmStringCommand.cxx +++ b/Source/cmStringCommand.cxx @@ -309,6 +309,7 @@ bool cmStringCommand::RegexMatchAll(std::vector<std::string> const& args) std::string output; const char* p = input.c_str(); while (re.find(p)) { + this->Makefile->ClearMatches(); this->Makefile->StoreMatches(re); std::string::size_type l = re.start(); std::string::size_type r = re.end(); @@ -391,6 +392,7 @@ bool cmStringCommand::RegexReplace(std::vector<std::string> const& args) std::string output; std::string::size_type base = 0; while (re.find(input.c_str() + base)) { + this->Makefile->ClearMatches(); this->Makefile->StoreMatches(re); std::string::size_type l2 = re.start(); std::string::size_type r = re.end(); |