From b5190f16810eb77388c861d1d1773e19644808db Mon Sep 17 00:00:00 2001 From: gdkchan Date: Sun, 11 Jul 2021 16:24:31 -0300 Subject: [PATCH] Fix virtual memory allocation being out of range (#2464) --- Ryujinx.HLE/HOS/Kernel/Memory/KPageTableBase.cs | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/Ryujinx.HLE/HOS/Kernel/Memory/KPageTableBase.cs b/Ryujinx.HLE/HOS/Kernel/Memory/KPageTableBase.cs index a2db8dcc12..e1ab0b93f2 100644 --- a/Ryujinx.HLE/HOS/Kernel/Memory/KPageTableBase.cs +++ b/Ryujinx.HLE/HOS/Kernel/Memory/KPageTableBase.cs @@ -2411,9 +2411,11 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory { if (info.State == MemoryState.Unmapped) { - ulong currBaseAddr = info.Address + reservedSize; + ulong currBaseAddr = info.Address <= regionStart ? regionStart : info.Address; ulong currEndAddr = info.Address + info.Size - 1; + currBaseAddr += reservedSize; + ulong address = BitUtils.AlignDown(currBaseAddr, alignment) + reservedStart; if (currBaseAddr > address) @@ -2423,9 +2425,10 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory ulong allocationEndAddr = address + totalNeededSize - 1; - if (allocationEndAddr <= regionEndAddr && - allocationEndAddr <= currEndAddr && - address < allocationEndAddr) + if (info.Address <= address && + address < allocationEndAddr && + allocationEndAddr <= regionEndAddr && + allocationEndAddr <= currEndAddr) { return address; }