From b37e394d526093a83a6aee5f89c77a1979b8bfa4 Mon Sep 17 00:00:00 2001 From: Nicholas Rodrigues Lordello Date: Tue, 9 Jan 2024 10:32:56 +0100 Subject: [PATCH] Use `memory-safe` for the SafeMock Fallback Implementation (#200) I noticed that the `fallback` function implementation was not memory safe for the SafeMock contract. This PR rectifies this. Additionally, FCL assembly is also not tagged as memory safe (but should be AFAIU). We should probably submit a PR upstream to tag assembly as memory safe. --- 4337/contracts/test/SafeMock.sol | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/4337/contracts/test/SafeMock.sol b/4337/contracts/test/SafeMock.sol index 67f53832b..0ea4c0d90 100644 --- a/4337/contracts/test/SafeMock.sol +++ b/4337/contracts/test/SafeMock.sol @@ -71,22 +71,24 @@ contract SafeMock { // solhint-disable-next-line payable-fallback,no-complex-fallback fallback() external payable { // solhint-disable-next-line no-inline-assembly - assembly { + assembly ("memory-safe") { let handler := sload(fallbackHandler.slot) if iszero(handler) { return(0, 0) } - calldatacopy(0, 0, calldatasize()) + + let ptr := mload(0x40) + calldatacopy(ptr, 0, calldatasize()) // The msg.sender address is shifted to the left by 12 bytes to remove the padding // Then the address without padding is stored right after the calldata - mstore(calldatasize(), shl(96, caller())) + mstore(add(ptr, calldatasize()), shl(96, caller())) // Add 20 bytes for the address appended add the end - let success := call(gas(), handler, 0, 0, add(calldatasize(), 20), 0, 0) - returndatacopy(0, 0, returndatasize()) + let success := call(gas(), handler, 0, ptr, add(calldatasize(), 20), 0, 0) + returndatacopy(ptr, 0, returndatasize()) if iszero(success) { - revert(0, returndatasize()) + revert(ptr, returndatasize()) } - return(0, returndatasize()) + return(ptr, returndatasize()) } }