mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Merge pull request #218 from chriseth/fix_overwriteMemory
Fix memory overwrite problem for arrays.
This commit is contained in:
commit
f4de369bad
@ -103,11 +103,21 @@ void MemoryItem::storeValue(Type const& _sourceType, SourceLocation const&, bool
|
||||
if (!_move)
|
||||
{
|
||||
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;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
solAssert(_sourceType == *m_dataType, "Conversion not implemented for assignment to memory.");
|
||||
|
@ -5816,6 +5816,21 @@ BOOST_AUTO_TEST_CASE(lone_struct_array_type)
|
||||
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()
|
||||
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user