find_package: Enforce maximum nesting depth below maximum recursion depth

The stack usage for nested `find_package` calls is much larger than for
other kinds of recursion, so enforce a lower limit to avoid stack
overflow.
This commit is contained in:
Brad King
2023-03-13 11:07:55 -04:00
parent 89b69bf1ad
commit 60ef076bac
7 changed files with 39 additions and 18 deletions

View File

@@ -976,6 +976,21 @@ bool cmFindPackageCommand::InitialPass(std::vector<std::string> const& args)
}
}
// Limit package nesting depth well below the recursion depth limit because
// find_package nesting uses more stack space than normal recursion.
{
static std::size_t const findPackageDepthMinMax = 100;
std::size_t const findPackageDepthMax = std::max(
this->Makefile->GetRecursionDepthLimit() / 2, findPackageDepthMinMax);
std::size_t const findPackageDepth =
this->Makefile->FindPackageRootPathStack.size() + 1;
if (findPackageDepth > findPackageDepthMax) {
this->SetError(cmStrCat("maximum nesting depth of ", findPackageDepthMax,
" exceeded."));
return false;
}
}
this->PushFindPackageRootPathStack();
this->SetModuleVariables(components, componentVarDefs);

View File

@@ -1,5 +1,7 @@
[0-9]+
CMake Error at .*/FindRecursivePackage\.cmake:1 \(message\):
Maximum recursion depth of [0-9]+ exceeded
CMake Error at [^
]*/Tests/RunCMake/MaxRecursionDepth/FindRecursivePackage.cmake:[0-9]+ \(find_package\):
find_package maximum nesting depth of [0-9]+ exceeded.
Call Stack \(most recent call first\):
.*/FindRecursivePackage\.cmake:3 \(find_package\)
[^
]*/Tests/RunCMake/MaxRecursionDepth/FindRecursivePackage.cmake:[0-9]+ \(find_package\)

View File

@@ -1,5 +1,5 @@
[0-9]+
CMake Error at FindRecursivePackage\.cmake:1 \(message\):
Maximum recursion depth of [0-9]+ exceeded
CMake Error at FindRecursivePackage.cmake:[0-9]+ \(find_package\):
find_package maximum nesting depth of [0-9]+ exceeded.
Call Stack \(most recent call first\):
FindRecursivePackage\.cmake:3 \(find_package\)
FindRecursivePackage.cmake:[0-9]+ \(find_package\)

View File

@@ -1,5 +1,7 @@
[0-9]+
CMake Error at .*/FindRecursivePackage\.cmake:1 \(message\):
Maximum recursion depth of [0-9]+ exceeded
CMake Error at [^
]*/Tests/RunCMake/MaxRecursionDepth/FindRecursivePackage.cmake:[0-9]+ \(find_package\):
find_package maximum nesting depth of [0-9]+ exceeded.
Call Stack \(most recent call first\):
.*/FindRecursivePackage\.cmake:3 \(find_package\)
[^
]*/Tests/RunCMake/MaxRecursionDepth/FindRecursivePackage.cmake:[0-9]+ \(find_package\)

View File

@@ -1,5 +1,5 @@
[0-9]+
CMake Error at FindRecursivePackage\.cmake:1 \(message\):
Maximum recursion depth of [0-9]+ exceeded
CMake Error at FindRecursivePackage.cmake:[0-9]+ \(find_package\):
find_package maximum nesting depth of [0-9]+ exceeded.
Call Stack \(most recent call first\):
FindRecursivePackage\.cmake:3 \(find_package\)
FindRecursivePackage.cmake:[0-9]+ \(find_package\)

View File

@@ -1,5 +1,7 @@
[0-9]+
CMake Error at .*/FindRecursivePackage\.cmake:1 \(message\):
Maximum recursion depth of [0-9]+ exceeded
CMake Error at [^
]*/Tests/RunCMake/MaxRecursionDepth/FindRecursivePackage.cmake:[0-9]+ \(find_package\):
find_package maximum nesting depth of [0-9]+ exceeded.
Call Stack \(most recent call first\):
.*/FindRecursivePackage\.cmake:3 \(find_package\)
[^
]*/Tests/RunCMake/MaxRecursionDepth/FindRecursivePackage.cmake:[0-9]+ \(find_package\)

View File

@@ -1,5 +1,5 @@
[0-9]+
CMake Error at FindRecursivePackage\.cmake:1 \(message\):
Maximum recursion depth of [0-9]+ exceeded
CMake Error at FindRecursivePackage.cmake:[0-9]+ \(find_package\):
find_package maximum nesting depth of [0-9]+ exceeded.
Call Stack \(most recent call first\):
FindRecursivePackage\.cmake:3 \(find_package\)
FindRecursivePackage.cmake:[0-9]+ \(find_package\)