From 1d8e9af407fc8c47cae6401fb71463771d397d30 Mon Sep 17 00:00:00 2001 From: Erik Kundt Date: Wed, 10 Oct 2018 17:06:48 +0200 Subject: Fixes crash while encoding too large arrays. --- Changelog.md | 1 + libsolidity/ast/Types.cpp | 3 +++ .../syntaxTests/array/length/parameter_too_large.sol | 5 +++++ .../syntaxTests/array/length/parameter_too_large_multidim.sol | 11 +++++++++++ .../array/length/parameter_too_large_multidim_ABIv2.sol | 10 ++++++++++ 5 files changed, 30 insertions(+) create mode 100644 test/libsolidity/syntaxTests/array/length/parameter_too_large.sol create mode 100644 test/libsolidity/syntaxTests/array/length/parameter_too_large_multidim.sol create mode 100644 test/libsolidity/syntaxTests/array/length/parameter_too_large_multidim_ABIv2.sol diff --git a/Changelog.md b/Changelog.md index 5bf194e4..ff95a89a 100644 --- a/Changelog.md +++ b/Changelog.md @@ -128,6 +128,7 @@ Bugfixes: * Type Checker: Fix freeze for negative fixed-point literals very close to ``0``, such as ``-1e-100``. * Type Checker: Dynamic types as key for public mappings return error instead of assertion fail. * Type Checker: Fix internal error when array index value is too large. + * Type Checker: Fix internal error when fixed-size array is too large to be encoded. * Type Checker: Fix internal error for array type conversions. * Type Checker: Fix internal error when array index is not an unsigned. * Type System: Allow arbitrary exponents for literals with a mantissa of zero. diff --git a/libsolidity/ast/Types.cpp b/libsolidity/ast/Types.cpp index 301687b4..d5d11478 100644 --- a/libsolidity/ast/Types.cpp +++ b/libsolidity/ast/Types.cpp @@ -1698,6 +1698,9 @@ bool ArrayType::operator==(Type const& _other) const bool ArrayType::validForCalldata() const { + if (auto arrayBaseType = dynamic_cast(baseType().get())) + if (!arrayBaseType->validForCalldata()) + return false; return unlimitedCalldataEncodedSize(true) <= numeric_limits::max(); } diff --git a/test/libsolidity/syntaxTests/array/length/parameter_too_large.sol b/test/libsolidity/syntaxTests/array/length/parameter_too_large.sol new file mode 100644 index 00000000..02e0a7cc --- /dev/null +++ b/test/libsolidity/syntaxTests/array/length/parameter_too_large.sol @@ -0,0 +1,5 @@ +contract C { + function f(bytes32[1263941234127518272] memory) public pure {} +} +// ---- +// TypeError: (26-61): Array is too large to be encoded. diff --git a/test/libsolidity/syntaxTests/array/length/parameter_too_large_multidim.sol b/test/libsolidity/syntaxTests/array/length/parameter_too_large_multidim.sol new file mode 100644 index 00000000..5f96ecd5 --- /dev/null +++ b/test/libsolidity/syntaxTests/array/length/parameter_too_large_multidim.sol @@ -0,0 +1,11 @@ +contract C { + function f(bytes32[1263941234127518272][500] memory) public pure {} + function f(uint[2**30][] memory) public pure {} + function f(uint[2**30][2**30][] memory) public pure {} + function f(uint[2**16][2**16][] memory) public pure {} +} +// ---- +// TypeError: (26-66): Array is too large to be encoded. +// TypeError: (96-116): Array is too large to be encoded. +// TypeError: (146-173): Array is too large to be encoded. +// TypeError: (203-230): Array is too large to be encoded. diff --git a/test/libsolidity/syntaxTests/array/length/parameter_too_large_multidim_ABIv2.sol b/test/libsolidity/syntaxTests/array/length/parameter_too_large_multidim_ABIv2.sol new file mode 100644 index 00000000..de1fde3f --- /dev/null +++ b/test/libsolidity/syntaxTests/array/length/parameter_too_large_multidim_ABIv2.sol @@ -0,0 +1,10 @@ +pragma experimental ABIEncoderV2; + +contract C { + function f(bytes32[1263941234127518272][500] memory) public pure {} + function f(uint[2**30][2**30][][] memory) public pure {} +} +// ---- +// Warning: (0-33): Experimental features are turned on. Do not use experimental features on live deployments. +// TypeError: (61-101): Array is too large to be encoded. +// TypeError: (131-160): Array is too large to be encoded. -- cgit