Fix regarding memory overwrite during sha3 computation.

This commit is contained in:
chriseth 2015-04-21 20:09:20 +02:00
parent a6d08950c6
commit a3820fa046

View File

@ -531,9 +531,12 @@ bool ExpressionCompiler::visit(FunctionCall const& _functionCall)
break; break;
case Location::SHA3: case Location::SHA3:
{ {
m_context << u256(0); // we might compute a sha as part of argumentsAppendCopyToMemory, this is only a hack
// and should be removed once we have a real free memory pointer
m_context << u256(0x40);
appendArgumentsCopyToMemory(arguments, TypePointers(), function.padArguments(), false, true); appendArgumentsCopyToMemory(arguments, TypePointers(), function.padArguments(), false, true);
m_context << u256(0) << eth::Instruction::SHA3; m_context << u256(0x40) << eth::Instruction::SWAP1 << eth::Instruction::SUB;
m_context << u256(0x40) << eth::Instruction::SHA3;
break; break;
} }
case Location::Log0: case Location::Log0:
@ -574,7 +577,8 @@ bool ExpressionCompiler::visit(FunctionCall const& _functionCall)
} }
solAssert(numIndexed <= 4, "Too many indexed arguments."); solAssert(numIndexed <= 4, "Too many indexed arguments.");
// Copy all non-indexed arguments to memory (data) // Copy all non-indexed arguments to memory (data)
m_context << u256(0); // Memory position is only a hack and should be removed once we have free memory pointer.
m_context << u256(0x40);
vector<ASTPointer<Expression const>> nonIndexedArgs; vector<ASTPointer<Expression const>> nonIndexedArgs;
TypePointers nonIndexedTypes; TypePointers nonIndexedTypes;
for (unsigned arg = 0; arg < arguments.size(); ++arg) for (unsigned arg = 0; arg < arguments.size(); ++arg)
@ -584,7 +588,8 @@ bool ExpressionCompiler::visit(FunctionCall const& _functionCall)
nonIndexedTypes.push_back(function.getParameterTypes()[arg]); nonIndexedTypes.push_back(function.getParameterTypes()[arg]);
} }
appendArgumentsCopyToMemory(nonIndexedArgs, nonIndexedTypes); appendArgumentsCopyToMemory(nonIndexedArgs, nonIndexedTypes);
m_context << u256(0) << eth::logInstruction(numIndexed); m_context << u256(0x40) << eth::Instruction::SWAP1 << eth::Instruction::SUB;
m_context << u256(0x40) << eth::logInstruction(numIndexed);
break; break;
} }
case Location::BlockHash: case Location::BlockHash: