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) | ||||
| 		{ | ||||
| 			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 | ||||
| 	{ | ||||
|  | ||||
| @ -5781,6 +5781,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