aboutsummaryrefslogtreecommitdiffstats
path: root/libsolidity/analysis/TypeChecker.cpp
diff options
context:
space:
mode:
authorChristian Parpart <christian@parpart.family>2018-07-31 22:18:00 +0800
committerAlex Beregszaszi <alex@rtfs.hu>2018-08-01 19:02:59 +0800
commit38f9667e090492d0581a5f1a14a48504242ca28e (patch)
tree27c2b3a9e4c77512331054a53c863a94efa3b58e /libsolidity/analysis/TypeChecker.cpp
parentef269bf40d3c6fc044c27654473353c556402b77 (diff)
downloaddexon-solidity-38f9667e090492d0581a5f1a14a48504242ca28e.tar
dexon-solidity-38f9667e090492d0581a5f1a14a48504242ca28e.tar.gz
dexon-solidity-38f9667e090492d0581a5f1a14a48504242ca28e.tar.bz2
dexon-solidity-38f9667e090492d0581a5f1a14a48504242ca28e.tar.lz
dexon-solidity-38f9667e090492d0581a5f1a14a48504242ca28e.tar.xz
dexon-solidity-38f9667e090492d0581a5f1a14a48504242ca28e.tar.zst
dexon-solidity-38f9667e090492d0581a5f1a14a48504242ca28e.zip
Guard CycleDetector against recursion exhaustion.
fixes #3935.
Diffstat (limited to 'libsolidity/analysis/TypeChecker.cpp')
-rw-r--r--libsolidity/analysis/TypeChecker.cpp5
1 files changed, 4 insertions, 1 deletions
diff --git a/libsolidity/analysis/TypeChecker.cpp b/libsolidity/analysis/TypeChecker.cpp
index d2fb9281..fdc7b434 100644
--- a/libsolidity/analysis/TypeChecker.cpp
+++ b/libsolidity/analysis/TypeChecker.cpp
@@ -595,8 +595,11 @@ bool TypeChecker::visit(StructDefinition const& _struct)
m_errorReporter.typeError(member->location(), "Type cannot be used in struct.");
// Check recursion, fatal error if detected.
- auto visitor = [&](StructDefinition const& _struct, CycleDetector<StructDefinition>& _cycleDetector)
+ auto visitor = [&](StructDefinition const& _struct, CycleDetector<StructDefinition>& _cycleDetector, size_t _depth)
{
+ if (_depth >= 256)
+ m_errorReporter.fatalDeclarationError(_struct.location(), "Struct definition exhausting cyclic dependency validator.");
+
for (ASTPointer<VariableDeclaration> const& member: _struct.members())
{
Type const* memberType = type(*member).get();