Make AccessManager.execute/schedule more conservative when delay is 0 (#4644)

(cherry picked from commit b849906ce4)
This commit is contained in:
Francisco
2023-10-02 16:43:12 -03:00
committed by Francisco Giordano
parent bf629d4ea7
commit 7a4064d886
3 changed files with 13 additions and 5 deletions

View File

@ -583,12 +583,12 @@ contract AccessManager is Context, Multicall, IAccessManager {
address caller = _msgSender();
// Fetch restrictions that apply to the caller on the targeted function
(bool immediate, uint32 setback) = _canCallExtended(caller, target, data);
(, uint32 setback) = _canCallExtended(caller, target, data);
uint48 minWhen = Time.timestamp() + setback;
// if call is not authorized, or if requested timing is too soon
if ((!immediate && setback == 0) || (when > 0 && when < minWhen)) {
// if call with delay is not authorized, or if requested timing is too soon
if (setback == 0 || (when > 0 && when < minWhen)) {
revert AccessManagerUnauthorizedCall(caller, target, _checkSelector(data));
}
@ -645,11 +645,12 @@ contract AccessManager is Context, Multicall, IAccessManager {
revert AccessManagerUnauthorizedCall(caller, target, _checkSelector(data));
}
// If caller is authorised, check operation was scheduled early enough
bytes32 operationId = hashOperation(caller, target, data);
uint32 nonce;
if (setback != 0) {
// If caller is authorised, check operation was scheduled early enough
// Consume an available schedule even if there is no currently enforced delay
if (setback != 0 || getSchedule(operationId) != 0) {
nonce = _consumeScheduledOp(operationId);
}