mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Merge pull request #12907 from ethereum/calldataReencodeValidationBug
Calldatasize-check during ABI encoding from calldata values with nested dynamic arrays.
This commit is contained in:
@@ -0,0 +1,12 @@
|
||||
pragma abicoder v2;
|
||||
|
||||
contract C {
|
||||
function f(uint[] calldata) public {}
|
||||
}
|
||||
// ====
|
||||
// revertStrings: debug
|
||||
// compileViaYul: also
|
||||
// ----
|
||||
// f(uint256[]): 0x20, 0 ->
|
||||
// f(uint256[]): 0x20, 1 -> FAILURE, hex"08c379a0", 0x20, 0x2b, "ABI decoding: invalid calldata a", "rray stride"
|
||||
// f(uint256[]): 0x20, 2 -> FAILURE, hex"08c379a0", 0x20, 0x2b, "ABI decoding: invalid calldata a", "rray stride"
|
||||
@@ -0,0 +1,10 @@
|
||||
contract C {
|
||||
function f(uint[] calldata) public {}
|
||||
}
|
||||
// ====
|
||||
// compileViaYul: also
|
||||
// ----
|
||||
// f(uint256[]): 0x20, 0 ->
|
||||
// f(uint256[]): 0x20, 1 -> FAILURE
|
||||
// f(uint256[]): 0x20, 2 -> FAILURE
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
pragma abicoder v2;
|
||||
|
||||
contract C {
|
||||
function h(uint[][] calldata a) public {
|
||||
abi.encode(a);
|
||||
}
|
||||
struct S { uint[] x; }
|
||||
function f(S calldata a) public {
|
||||
abi.encode(a);
|
||||
}
|
||||
}
|
||||
// ====
|
||||
// compileViaYul: also
|
||||
// revertStrings: debug
|
||||
// ----
|
||||
// h(uint256[][]): 0x20, 1, 0x20, 0 ->
|
||||
// h(uint256[][]): 0x20, 1, 0x20, 1 -> FAILURE, hex"08c379a0", 0x20, 0x1e, "Invalid calldata access stride"
|
||||
// h(uint256[][]): 0x20, 1, 0x20, 2 -> FAILURE, hex"08c379a0", 0x20, 0x1e, "Invalid calldata access stride"
|
||||
// h(uint256[][]): 0x20, 1, 0x20, 3 -> FAILURE, hex"08c379a0", 0x20, 0x1e, "Invalid calldata access stride"
|
||||
// f((uint256[])): 0x20, 0x20, 0 ->
|
||||
// f((uint256[])): 0x20, 0x20, 1 -> FAILURE, hex"08c379a0", 0x20, 0x1e, "Invalid calldata access stride"
|
||||
// f((uint256[])): 0x20, 0x20, 2 -> FAILURE, hex"08c379a0", 0x20, 0x1e, "Invalid calldata access stride"
|
||||
// f((uint256[])): 0x20, 0x20, 3 -> FAILURE, hex"08c379a0", 0x20, 0x1e, "Invalid calldata access stride"
|
||||
@@ -0,0 +1,27 @@
|
||||
pragma abicoder v2;
|
||||
|
||||
contract C {
|
||||
function f(uint[3][] calldata a) public {
|
||||
abi.encode(a);
|
||||
}
|
||||
function f(uint[][3] calldata a) public {
|
||||
abi.encode(a);
|
||||
}
|
||||
function f(uint[2][2] calldata a) public {
|
||||
abi.encode(a);
|
||||
}
|
||||
}
|
||||
// ====
|
||||
// compileViaYul: also
|
||||
// ----
|
||||
// f(uint256[3][]): 0x20, 1, 0x01 -> FAILURE
|
||||
// f(uint256[3][]): 0x20, 1, 0x01, 0x02 -> FAILURE
|
||||
// f(uint256[3][]): 0x20, 1, 0x01, 0x02, 0x03 ->
|
||||
// f(uint256[][3]): 0x20, 0x60, 0x60, 0x60, 3, 0x01 -> FAILURE
|
||||
// f(uint256[][3]): 0x20, 0x60, 0x60, 0x60, 3, 0x01, 0x02 -> FAILURE
|
||||
// f(uint256[][3]): 0x20, 0x60, 0x60, 0x60, 3, 0x01, 0x02, 0x03 ->
|
||||
// f(uint256[2][2]): 0x01 -> FAILURE
|
||||
// f(uint256[2][2]): 0x01, 0x02 -> FAILURE
|
||||
// f(uint256[2][2]): 0x01, 0x02, 0x03 -> FAILURE
|
||||
// f(uint256[2][2]): 0x01, 0x02, 0x03, 0x04 ->
|
||||
// f(uint256[2][2]): 0x01, 0x02, 0x03, 0x04, 0x05 ->
|
||||
Reference in New Issue
Block a user