From 3884bf6468ac6bbb58c2b3feaa74e87f821b52f3 Mon Sep 17 00:00:00 2001 From: Alexander Bulekov Date: Tue, 16 May 2023 04:40:02 -0400 Subject: memory: stricter checks prior to unsetting engaged_in_io engaged_in_io could be unset by an MR with re-entrancy checks disabled. Ensure that only MRs that can set the engaged_in_io flag can unset it. Signed-off-by: Alexander Bulekov Message-Id: <20230516084002.3813836-1-alxndr@bu.edu> Reviewed-by: Darren Kenny Signed-off-by: Thomas Huth --- softmmu/memory.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'softmmu') diff --git a/softmmu/memory.c b/softmmu/memory.c index 342c121..9ee4131 100644 --- a/softmmu/memory.c +++ b/softmmu/memory.c @@ -534,6 +534,7 @@ static MemTxResult access_with_adjusted_size(hwaddr addr, unsigned access_size; unsigned i; MemTxResult r = MEMTX_OK; + bool reentrancy_guard_applied = false; if (!access_size_min) { access_size_min = 1; @@ -552,6 +553,7 @@ static MemTxResult access_with_adjusted_size(hwaddr addr, return MEMTX_ACCESS_ERROR; } mr->dev->mem_reentrancy_guard.engaged_in_io = true; + reentrancy_guard_applied = true; } /* FIXME: support unaligned access? */ @@ -568,7 +570,7 @@ static MemTxResult access_with_adjusted_size(hwaddr addr, access_mask, attrs); } } - if (mr->dev) { + if (mr->dev && reentrancy_guard_applied) { mr->dev->mem_reentrancy_guard.engaged_in_io = false; } return r; -- cgit v1.1