Skip to content

Commit f31a835

Browse files
committed
Change DATALOADN immediate argument to mean offset in bytes
1 parent 19bc929 commit f31a835

File tree

4 files changed

+23
-8
lines changed

4 files changed

+23
-8
lines changed

lib/evmone/eof.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,7 @@ EOFValidationError validate_instructions(
225225
else if (op == OP_DATALOADN)
226226
{
227227
const auto index = read_uint16_be(&code[i + 1]);
228-
if (index >= header.data_size / 32)
228+
if (header.data_size < 32 || index > header.data_size - 32)
229229
return EOFValidationError::invalid_dataloadn_index;
230230
i += 2;
231231
}

lib/evmone/instructions.hpp

+1-2
Original file line numberDiff line numberDiff line change
@@ -946,8 +946,7 @@ inline code_iterator dataloadn(StackTop stack, ExecutionState& state, code_itera
946946
{
947947
const auto index = read_uint16_be(&pos[1]);
948948

949-
const auto begin = static_cast<size_t>(index * 32);
950-
stack.push(intx::be::unsafe::load<uint256>(&state.data[begin]));
949+
stack.push(intx::be::unsafe::load<uint256>(&state.data[index]));
951950
return pos + 3;
952951
}
953952

test/unittests/eof_validation_test.cpp

+14-5
Original file line numberDiff line numberDiff line change
@@ -1256,7 +1256,12 @@ TEST(eof_validation, dataloadn)
12561256
EOFValidationError::success);
12571257

12581258
// DATALOADN{1}
1259-
EXPECT_EQ(validate_eof("EF0001 010004 0200010005 030040 00 00000001 b900015000"
1259+
EXPECT_EQ(validate_eof("EF0001 010004 0200010005 030021 00 00000001 b900015000"
1260+
"000000000000000011111111111111112222222222222222333333333333333344"),
1261+
EOFValidationError::success);
1262+
1263+
// DATALOADN{32}
1264+
EXPECT_EQ(validate_eof("EF0001 010004 0200010005 030040 00 00000001 b900205000"
12601265
"0000000000000000111111111111111122222222222222223333333333333333"
12611266
"0000000000000000111111111111111122222222222222223333333333333333"),
12621267
EOFValidationError::success);
@@ -1266,7 +1271,12 @@ TEST(eof_validation, dataloadn)
12661271
EOFValidationError::invalid_dataloadn_index);
12671272

12681273
// DATALOADN{1} - out of data section bounds
1269-
EXPECT_EQ(validate_eof("EF0001 010004 0200010005 030020 00 00000001 b900015000"
1274+
EXPECT_EQ(validate_eof("EF0001 010004 0200010005 030001 00 00000001 b900015000"
1275+
"00"),
1276+
EOFValidationError::invalid_dataloadn_index);
1277+
1278+
// DATALOADN{32} - out of data section bounds
1279+
EXPECT_EQ(validate_eof("EF0001 010004 0200010005 030020 00 00000001 b900205000"
12701280
"0000000000000000111111111111111122222222222222223333333333333333"),
12711281
EOFValidationError::invalid_dataloadn_index);
12721282

@@ -1275,9 +1285,8 @@ TEST(eof_validation, dataloadn)
12751285
"0000000000000000111111111111111122222222222222223333333333333333"),
12761286
EOFValidationError::invalid_dataloadn_index);
12771287

1278-
// DATALOADN{2} - truncated word
1279-
EXPECT_EQ(validate_eof("EF0001 010004 0200010005 03005f 00 00000001 b900025000"
1280-
"0000000000000000111111111111111122222222222222223333333333333333"
1288+
// DATALOADN{32} - truncated word
1289+
EXPECT_EQ(validate_eof("EF0001 010004 0200010005 03003F 00 00000001 b900205000"
12811290
"0000000000000000111111111111111122222222222222223333333333333333"
12821291
"00000000000000001111111111111111222222222222222233333333333333"),
12831292
EOFValidationError::invalid_dataloadn_index);

test/unittests/evm_eof_test.cpp

+7
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,13 @@ TEST_P(evm, eof1_dataloadn)
215215
code = eof1_bytecode(bytecode(OP_DATALOADN) + "0001" + ret_top(), 2, data);
216216
execute(code);
217217
EXPECT_STATUS(EVMC_SUCCESS);
218+
EXPECT_EQ(bytes_view(result.output_data, result.output_size),
219+
"00000000000000111111111111111122222222222222223333333333333333aa"_hex);
220+
221+
// DATALOADN{32}
222+
code = eof1_bytecode(bytecode(OP_DATALOADN) + "0020" + ret_top(), 2, data);
223+
execute(code);
224+
EXPECT_STATUS(EVMC_SUCCESS);
218225
EXPECT_EQ(bytes_view(result.output_data, result.output_size),
219226
"aaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbccccccccccccccccdddddddddddddddd"_hex);
220227
}

0 commit comments

Comments
 (0)