avoid overwrite of target function
This commit is contained in:
parent
86cf02e5f9
commit
266b1c3056
|
@ -4,7 +4,8 @@ pragma solidity ^0.4.17;
|
|||
/**
|
||||
* @title DelegatedCall
|
||||
* @author Ricardo Guilherme Schmidt (Status Research & Development GmbH)
|
||||
* @dev Abstract contract that delegates calls by `delegated` modifier to result of `_target()`
|
||||
* @dev Abstract contract that delegates calls by `delegated` modifier to result of `targetDelegatedCall()`
|
||||
* Important to avoid overwriting wrong storage pointers is that never define storage to this contract
|
||||
*/
|
||||
contract DelegatedCall {
|
||||
/**
|
||||
|
@ -12,20 +13,21 @@ contract DelegatedCall {
|
|||
*/
|
||||
modifier delegated {
|
||||
//require successfull delegate call to remote `_target()`
|
||||
require(_target().delegatecall(msg.data));
|
||||
require(targetDelegatedCall().delegatecall(msg.data));
|
||||
assembly {
|
||||
let outSize := returndatasize
|
||||
let outDataPtr := mload(0x40) //load memory
|
||||
returndatacopy(outDataPtr, 0, outSize) //copy last return into pointer
|
||||
return(outDataPtr, outSize)
|
||||
}
|
||||
assert(false); //should never reach here
|
||||
_; //never will execute local logic
|
||||
}
|
||||
|
||||
/**
|
||||
* @dev defines the address for delegation of calls
|
||||
*/
|
||||
function _target()
|
||||
function targetDelegatedCall()
|
||||
internal
|
||||
constant
|
||||
returns(address);
|
||||
|
|
Loading…
Reference in New Issue