summaryrefslogtreecommitdiffstats
path: root/Source/cmStringCommand.cxx
diff options
context:
space:
mode:
authorBen Boeckel <ben.boeckel@kitware.com>2017-07-18 15:08:10 (GMT)
committerBen Boeckel <ben.boeckel@kitware.com>2017-07-21 13:09:56 (GMT)
commitb7941641430feeefadc6f16e2cecf6b50bd9fbe3 (patch)
tree0cd3337f4b799631752d94f3110c6943cd792ecd /Source/cmStringCommand.cxx
parentec049641c46eb788b25713e5d96ff32c89f0e819 (diff)
downloadCMake-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.cxx2
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();