From 049c7f7a8e503f4a3f99104e4a3dd82637db226b Mon Sep 17 00:00:00 2001 From: chriseth Date: Mon, 16 Nov 2020 20:12:25 +0100 Subject: [PATCH] Disallow using modifiers not in the current contract or in base contracts. --- libsolidity/analysis/TypeChecker.cpp | 12 ++++++++++++ .../syntaxTests/modifiers/access_in_library.sol | 9 +++++++++ .../syntaxTests/modifiers/cross_contract_access.sol | 9 +++++++++ .../syntaxTests/modifiers/cross_contract_base.sol | 8 ++++++++ .../modifiers/cross_contract_unrelated.sol | 11 +++++++++++ .../syntaxTests/modifiers/library_via_using.sol | 10 ++++++++++ 6 files changed, 59 insertions(+) create mode 100644 test/libsolidity/syntaxTests/modifiers/access_in_library.sol create mode 100644 test/libsolidity/syntaxTests/modifiers/cross_contract_access.sol create mode 100644 test/libsolidity/syntaxTests/modifiers/cross_contract_base.sol create mode 100644 test/libsolidity/syntaxTests/modifiers/cross_contract_unrelated.sol create mode 100644 test/libsolidity/syntaxTests/modifiers/library_via_using.sol diff --git a/libsolidity/analysis/TypeChecker.cpp b/libsolidity/analysis/TypeChecker.cpp index 5d9e23242..5d5d7a852 100644 --- a/libsolidity/analysis/TypeChecker.cpp +++ b/libsolidity/analysis/TypeChecker.cpp @@ -630,7 +630,19 @@ void TypeChecker::visitManually( vector> emptyParameterList; vector> const* parameters = nullptr; if (auto modifierDecl = dynamic_cast(declaration)) + { parameters = &modifierDecl->parameters(); + if (auto const* modifierContract = dynamic_cast(modifierDecl->scope())) + if (m_currentContract) + { + if (!contains(m_currentContract->annotation().linearizedBaseContracts, modifierContract)) + m_errorReporter.typeError( + 9428_error, + _modifier.location(), + "Can only use modifiers defined in the current contract or in base contracts." + ); + } + } else // check parameters for Base constructors for (ContractDefinition const* base: _bases) diff --git a/test/libsolidity/syntaxTests/modifiers/access_in_library.sol b/test/libsolidity/syntaxTests/modifiers/access_in_library.sol new file mode 100644 index 000000000..052c60bde --- /dev/null +++ b/test/libsolidity/syntaxTests/modifiers/access_in_library.sol @@ -0,0 +1,9 @@ +library L { + modifier m() { _; } +} +contract C { + function f() L.m public { + } +} +// ---- +// TypeError 9428: (68-71): Can only use modifiers defined in the current contract or in base contracts. diff --git a/test/libsolidity/syntaxTests/modifiers/cross_contract_access.sol b/test/libsolidity/syntaxTests/modifiers/cross_contract_access.sol new file mode 100644 index 000000000..430b8afe1 --- /dev/null +++ b/test/libsolidity/syntaxTests/modifiers/cross_contract_access.sol @@ -0,0 +1,9 @@ +contract C { + modifier m() { _; } +} +contract D { + function f() C.m public { + } +} +// ---- +// TypeError 9428: (69-72): Can only use modifiers defined in the current contract or in base contracts. diff --git a/test/libsolidity/syntaxTests/modifiers/cross_contract_base.sol b/test/libsolidity/syntaxTests/modifiers/cross_contract_base.sol new file mode 100644 index 000000000..391feb859 --- /dev/null +++ b/test/libsolidity/syntaxTests/modifiers/cross_contract_base.sol @@ -0,0 +1,8 @@ +contract C { + modifier m() { _; } +} +contract D is C { + function f() C.m public { + } +} +// ---- diff --git a/test/libsolidity/syntaxTests/modifiers/cross_contract_unrelated.sol b/test/libsolidity/syntaxTests/modifiers/cross_contract_unrelated.sol new file mode 100644 index 000000000..7ca8b9ca2 --- /dev/null +++ b/test/libsolidity/syntaxTests/modifiers/cross_contract_unrelated.sol @@ -0,0 +1,11 @@ +contract A {} +contract C is A { + modifier m() { _; } +} +contract D is A { + function f() C.m public { + } +} +contract T is D, C {} +// ---- +// TypeError 9428: (93-96): Can only use modifiers defined in the current contract or in base contracts. diff --git a/test/libsolidity/syntaxTests/modifiers/library_via_using.sol b/test/libsolidity/syntaxTests/modifiers/library_via_using.sol new file mode 100644 index 000000000..bac0b33da --- /dev/null +++ b/test/libsolidity/syntaxTests/modifiers/library_via_using.sol @@ -0,0 +1,10 @@ +library L { + modifier m() { _; } +} +contract C { + using L for *; + function f() L.m public { + } +} +// ---- +// TypeError 9428: (87-90): Can only use modifiers defined in the current contract or in base contracts.