kern: simplify SetupForIpcClient cleanup

This commit is contained in:
Michael Scire 2020-08-05 20:06:23 -07:00 committed by SciresM
parent b8c2782ede
commit 4a35904d73

View file

@ -2915,35 +2915,10 @@ namespace ams::kern {
/* Ensure that on failure, we roll back appropriately. */ /* Ensure that on failure, we roll back appropriately. */
size_t mapped_size = 0; size_t mapped_size = 0;
auto unmap_guard = SCOPE_GUARD { auto cleanup_guard = SCOPE_GUARD {
if (mapped_size > 0) { if (mapped_size > 0) {
/* Determine where the mapping ends. */ /* NOTE: Nintendo does not check that this cleanup succeeds. */
const auto mapped_end = GetInteger(mapping_src_start) + mapped_size; this->CleanupForIpcClientOnServerSetupFailure(page_list, mapping_src_start, mapped_size, test_perm);
const auto mapped_last = mapped_end - 1;
KMemoryBlockManager::const_iterator it = this->memory_block_manager.FindIterator(mapping_src_start);
while (true) {
const KMemoryInfo info = it->GetMemoryInfo();
const auto cur_start = info.GetAddress() >= GetInteger(mapping_src_start) ? info.GetAddress() : GetInteger(mapping_src_start);
const auto cur_end = mapped_last <= info.GetLastAddress() ? mapped_end : info.GetEndAddress();
const size_t cur_size = cur_end - cur_start;
/* Fix the permissions, if we need to. */
if ((info.GetPermission() & KMemoryPermission_IpcLockChangeMask) != src_perm) {
const KPageProperties properties = { info.GetPermission(), false, false, false };
MESOSPHERE_R_ABORT_UNLESS(this->Operate(page_list, cur_start, cur_size / PageSize, Null<KPhysicalAddress>, false, properties, OperationType_ChangePermissions, true));
}
/* If the block is at the end, we're done. */
if (mapped_last <= info.GetLastAddress()) {
break;
}
/* Advance. */
++it;
MESOSPHERE_ABORT_UNLESS(it != this->memory_block_manager.end());
}
} }
}; };
@ -2980,8 +2955,8 @@ namespace ams::kern {
MESOSPHERE_ABORT_UNLESS(it != this->memory_block_manager.end()); MESOSPHERE_ABORT_UNLESS(it != this->memory_block_manager.end());
} }
/* We succeeded, so no need to unmap. */ /* We succeeded, so no need to cleanup. */
unmap_guard.Cancel(); cleanup_guard.Cancel();
return ResultSuccess(); return ResultSuccess();
} }