mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Fix memory overwrite problem for arrays.
This commit is contained in:
parent
c881d103b2
commit
0c900f9b8a
@ -103,10 +103,20 @@ void MemoryItem::storeValue(Type const& _sourceType, SourceLocation const&, bool
|
|||||||
if (!_move)
|
if (!_move)
|
||||||
{
|
{
|
||||||
utils.moveToStackTop(m_dataType->sizeOnStack());
|
utils.moveToStackTop(m_dataType->sizeOnStack());
|
||||||
utils.copyToStackTop(2, m_dataType->sizeOnStack());
|
utils.copyToStackTop(1 + m_dataType->sizeOnStack(), m_dataType->sizeOnStack());
|
||||||
|
}
|
||||||
|
if (!m_padded)
|
||||||
|
{
|
||||||
|
solAssert(m_dataType->calldataEncodedSize(false) == 1, "Invalid non-padded type.");
|
||||||
|
if (m_dataType->category() == Type::Category::FixedBytes)
|
||||||
|
m_context << u256(0) << eth::Instruction::BYTE;
|
||||||
|
m_context << eth::Instruction::SWAP1 << eth::Instruction::MSTORE8;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
utils.storeInMemoryDynamic(*m_dataType, m_padded);
|
||||||
|
m_context << eth::Instruction::POP;
|
||||||
}
|
}
|
||||||
utils.storeInMemoryDynamic(*m_dataType, m_padded);
|
|
||||||
m_context << eth::Instruction::POP;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -5781,6 +5781,21 @@ BOOST_AUTO_TEST_CASE(lone_struct_array_type)
|
|||||||
BOOST_CHECK(callContractFunction("f()") == encodeArgs(u256(3)));
|
BOOST_CHECK(callContractFunction("f()") == encodeArgs(u256(3)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BOOST_AUTO_TEST_CASE(memory_overwrite)
|
||||||
|
{
|
||||||
|
char const* sourceCode = R"(
|
||||||
|
contract C {
|
||||||
|
function f() returns (bytes x) {
|
||||||
|
x = "12345";
|
||||||
|
x[3] = 0x61;
|
||||||
|
x[0] = 0x62;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)";
|
||||||
|
compileAndRun(sourceCode);
|
||||||
|
BOOST_CHECK(callContractFunction("f()") == encodeDyn(string("b23a5")));
|
||||||
|
}
|
||||||
|
|
||||||
BOOST_AUTO_TEST_SUITE_END()
|
BOOST_AUTO_TEST_SUITE_END()
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user