kern: fix KCodeMemory SVCs when Owner process != Generator process

This commit is contained in:
Michael Scire 2020-09-17 08:25:27 -07:00
parent 84f17f6a3a
commit 9b3b08bdeb
2 changed files with 4 additions and 4 deletions

View file

@ -133,7 +133,7 @@ namespace ams::kern {
} }
/* Map the memory. */ /* Map the memory. */
R_TRY(GetCurrentProcess().GetPageTable().MapPageGroup(address, GetReference(this->page_group), KMemoryState_GeneratedCode, k_perm)); R_TRY(this->owner->GetPageTable().MapPageGroup(address, GetReference(this->page_group), KMemoryState_GeneratedCode, k_perm));
/* Mark ourselves as mapped. */ /* Mark ourselves as mapped. */
this->is_owner_mapped = true; this->is_owner_mapped = true;
@ -151,7 +151,7 @@ namespace ams::kern {
KScopedLightLock lk(this->lock); KScopedLightLock lk(this->lock);
/* Unmap the memory. */ /* Unmap the memory. */
R_TRY(GetCurrentProcess().GetPageTable().UnmapPageGroup(address, GetReference(this->page_group), KMemoryState_GeneratedCode)); R_TRY(this->owner->GetPageTable().UnmapPageGroup(address, GetReference(this->page_group), KMemoryState_GeneratedCode));
/* Mark ourselves as unmapped. */ /* Mark ourselves as unmapped. */
MESOSPHERE_ASSERT(this->is_owner_mapped); MESOSPHERE_ASSERT(this->is_owner_mapped);

View file

@ -110,7 +110,7 @@ namespace ams::kern::svc {
case ams::svc::CodeMemoryOperation_MapToOwner: case ams::svc::CodeMemoryOperation_MapToOwner:
{ {
/* Check that the region is in range. */ /* Check that the region is in range. */
R_UNLESS(GetCurrentProcess().GetPageTable().CanContain(address, size, KMemoryState_GeneratedCode), svc::ResultInvalidMemoryRegion()); R_UNLESS(code_mem->GetOwner()->GetPageTable().CanContain(address, size, KMemoryState_GeneratedCode), svc::ResultInvalidMemoryRegion());
/* Check the memory permission. */ /* Check the memory permission. */
R_UNLESS(IsValidMapToOwnerCodeMemoryPermission(perm), svc::ResultInvalidNewMemoryPermission()); R_UNLESS(IsValidMapToOwnerCodeMemoryPermission(perm), svc::ResultInvalidNewMemoryPermission());
@ -122,7 +122,7 @@ namespace ams::kern::svc {
case ams::svc::CodeMemoryOperation_UnmapFromOwner: case ams::svc::CodeMemoryOperation_UnmapFromOwner:
{ {
/* Check that the region is in range. */ /* Check that the region is in range. */
R_UNLESS(GetCurrentProcess().GetPageTable().CanContain(address, size, KMemoryState_GeneratedCode), svc::ResultInvalidMemoryRegion()); R_UNLESS(code_mem->GetOwner()->GetPageTable().CanContain(address, size, KMemoryState_GeneratedCode), svc::ResultInvalidMemoryRegion());
/* Check the memory permission. */ /* Check the memory permission. */
R_UNLESS(IsValidUnmapFromOwnerCodeMemoryPermission(perm), svc::ResultInvalidNewMemoryPermission()); R_UNLESS(IsValidUnmapFromOwnerCodeMemoryPermission(perm), svc::ResultInvalidNewMemoryPermission());