cmListCommand: Handle invalid FOR selector ranges Fixes crashes involving invalid ranges specified in list(TRANSFORM ... FOR ...) calls. * Report error when step is not positive * Report error when start is after stop Fixes: #22985
diff --git a/Source/cmListCommand.cxx b/Source/cmListCommand.cxx index b358327..56345df 100644 --- a/Source/cmListCommand.cxx +++ b/Source/cmListCommand.cxx
@@ -678,6 +678,14 @@ this->Start = this->NormalizeIndex(this->Start, count); this->Stop = this->NormalizeIndex(this->Stop, count); + // Does stepping move us further from the end? + if (this->Start > this->Stop) { + throw transform_error( + cmStrCat("sub-command TRANSFORM, selector FOR " + "expects <start> to be no greater than <stop> (", + this->Start, " > ", this->Stop, ")")); + } + // compute indexes auto size = (this->Stop - this->Start + 1) / this->Step; if ((this->Stop - this->Start + 1) % this->Step != 0) { @@ -1026,9 +1034,10 @@ } } - if (step < 0) { + if (step <= 0) { status.SetError("sub-command TRANSFORM, selector FOR expects " - "non negative numeric value for <step>."); + "positive numeric value for <step>."); + return false; } command.Selector =
diff --git a/Tests/RunCMake/list/RunCMakeTest.cmake b/Tests/RunCMake/list/RunCMakeTest.cmake index c11891c..eb43ee0 100644 --- a/Tests/RunCMake/list/RunCMakeTest.cmake +++ b/Tests/RunCMake/list/RunCMakeTest.cmake
@@ -77,6 +77,9 @@ run_cmake(TRANSFORM-Selector-FOR-TooManyArguments) run_cmake(TRANSFORM-Selector-FOR-BadArgument) run_cmake(TRANSFORM-Selector-FOR-InvalidIndex) +run_cmake(TRANSFORM-Selector-FOR-ZeroStepArgument) +run_cmake(TRANSFORM-Selector-FOR-NegativeStepArgument) +run_cmake(TRANSFORM-Selector-FOR-BackwardsRange) # 'output' oriented tests run_cmake(TRANSFORM-Output-OUTPUT_VARIABLE-NoArguments) run_cmake(TRANSFORM-Output-OUTPUT_VARIABLE-TooManyArguments)
diff --git a/Tests/RunCMake/list/TRANSFORM-Selector-FOR-BackwardsRange-result.txt b/Tests/RunCMake/list/TRANSFORM-Selector-FOR-BackwardsRange-result.txt new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/Tests/RunCMake/list/TRANSFORM-Selector-FOR-BackwardsRange-result.txt
@@ -0,0 +1 @@ +1
diff --git a/Tests/RunCMake/list/TRANSFORM-Selector-FOR-BackwardsRange-stderr.txt b/Tests/RunCMake/list/TRANSFORM-Selector-FOR-BackwardsRange-stderr.txt new file mode 100644 index 0000000..1acdc15 --- /dev/null +++ b/Tests/RunCMake/list/TRANSFORM-Selector-FOR-BackwardsRange-stderr.txt
@@ -0,0 +1,5 @@ +^CMake Error at TRANSFORM-Selector-FOR-BackwardsRange.cmake:2 \(list\): + list sub-command TRANSFORM, selector FOR expects <start> to be no greater + than <stop> \(2 > 1\) +Call Stack \(most recent call first\): + CMakeLists.txt:3 \(include\)$
diff --git a/Tests/RunCMake/list/TRANSFORM-Selector-FOR-BackwardsRange.cmake b/Tests/RunCMake/list/TRANSFORM-Selector-FOR-BackwardsRange.cmake new file mode 100644 index 0000000..761c187 --- /dev/null +++ b/Tests/RunCMake/list/TRANSFORM-Selector-FOR-BackwardsRange.cmake
@@ -0,0 +1,2 @@ +set(mylist alpha bravo charlie) +list(TRANSFORM mylist TOUPPER FOR 2 1)
diff --git a/Tests/RunCMake/list/TRANSFORM-Selector-FOR-NegativeStepArgument-result.txt b/Tests/RunCMake/list/TRANSFORM-Selector-FOR-NegativeStepArgument-result.txt new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/Tests/RunCMake/list/TRANSFORM-Selector-FOR-NegativeStepArgument-result.txt
@@ -0,0 +1 @@ +1
diff --git a/Tests/RunCMake/list/TRANSFORM-Selector-FOR-NegativeStepArgument-stderr.txt b/Tests/RunCMake/list/TRANSFORM-Selector-FOR-NegativeStepArgument-stderr.txt new file mode 100644 index 0000000..b9845a7 --- /dev/null +++ b/Tests/RunCMake/list/TRANSFORM-Selector-FOR-NegativeStepArgument-stderr.txt
@@ -0,0 +1,5 @@ +^CMake Error at TRANSFORM-Selector-FOR-NegativeStepArgument.cmake:2 \(list\): + list sub-command TRANSFORM, selector FOR expects positive numeric value for + <step>. +Call Stack \(most recent call first\): + CMakeLists.txt:3 \(include\)$
diff --git a/Tests/RunCMake/list/TRANSFORM-Selector-FOR-NegativeStepArgument.cmake b/Tests/RunCMake/list/TRANSFORM-Selector-FOR-NegativeStepArgument.cmake new file mode 100644 index 0000000..0876512 --- /dev/null +++ b/Tests/RunCMake/list/TRANSFORM-Selector-FOR-NegativeStepArgument.cmake
@@ -0,0 +1,2 @@ +set(mylist alpha bravo charlie) +list(TRANSFORM mylist TOUPPER FOR 0 2 -1)
diff --git a/Tests/RunCMake/list/TRANSFORM-Selector-FOR-ZeroStepArgument-result.txt b/Tests/RunCMake/list/TRANSFORM-Selector-FOR-ZeroStepArgument-result.txt new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/Tests/RunCMake/list/TRANSFORM-Selector-FOR-ZeroStepArgument-result.txt
@@ -0,0 +1 @@ +1
diff --git a/Tests/RunCMake/list/TRANSFORM-Selector-FOR-ZeroStepArgument-stderr.txt b/Tests/RunCMake/list/TRANSFORM-Selector-FOR-ZeroStepArgument-stderr.txt new file mode 100644 index 0000000..e8be4f1 --- /dev/null +++ b/Tests/RunCMake/list/TRANSFORM-Selector-FOR-ZeroStepArgument-stderr.txt
@@ -0,0 +1,5 @@ +^CMake Error at TRANSFORM-Selector-FOR-ZeroStepArgument.cmake:2 \(list\): + list sub-command TRANSFORM, selector FOR expects positive numeric value for + <step>. +Call Stack \(most recent call first\): + CMakeLists.txt:3 \(include\)$
diff --git a/Tests/RunCMake/list/TRANSFORM-Selector-FOR-ZeroStepArgument.cmake b/Tests/RunCMake/list/TRANSFORM-Selector-FOR-ZeroStepArgument.cmake new file mode 100644 index 0000000..7b14eb6 --- /dev/null +++ b/Tests/RunCMake/list/TRANSFORM-Selector-FOR-ZeroStepArgument.cmake
@@ -0,0 +1,2 @@ +set(mylist alpha bravo charlie) +list(TRANSFORM mylist TOUPPER FOR 0 2 0)