Skip to content

Commit

Permalink
Make AccessManager.execute/schedule more conservative when delay is 0 (
Browse files Browse the repository at this point in the history
…#4644)

(cherry picked from commit b849906)
  • Loading branch information
frangio committed Oct 2, 2023
1 parent bf629d4 commit 7a4064d
Show file tree
Hide file tree
Showing 3 changed files with 13 additions and 5 deletions.
5 changes: 5 additions & 0 deletions .changeset/thirty-drinks-happen.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'openzeppelin-solidity': major
---

`AccessManager`: Make `schedule` and `execute` more conservative when delay is 0.
11 changes: 6 additions & 5 deletions contracts/access/manager/AccessManager.sol
Original file line number Diff line number Diff line change
Expand Up @@ -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));
}

Expand Down Expand Up @@ -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);
}

Expand Down
2 changes: 2 additions & 0 deletions test/access/manager/AccessManager.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -636,6 +636,8 @@ contract('AccessManager', function (accounts) {

describe(description, function () {
beforeEach(async function () {
if (!delay || fnRole === ROLES.PUBLIC) this.skip(); // TODO: Fixed in #4613

// setup
await Promise.all([
this.manager.$_setTargetClosed(this.target.address, closed),
Expand Down

0 comments on commit 7a4064d

Please sign in to comment.