diff --git a/Ryujinx.HLE/FileSystem/FileSystemProvider.cs b/Ryujinx.HLE/FileSystem/FileSystemProvider.cs index 650ab402cc..f5459eece0 100644 --- a/Ryujinx.HLE/FileSystem/FileSystemProvider.cs +++ b/Ryujinx.HLE/FileSystem/FileSystemProvider.cs @@ -281,7 +281,6 @@ namespace Ryujinx.HLE.FileSystem throw new InvalidOperationException($"Path {path} is not a child directory of {_rootPath}"); } - public FileTimestamp GetFileTimeStampRaw(string name) { CheckIfDescendentOfRootPath(name); diff --git a/Ryujinx.HLE/HOS/Kernel/SupervisorCall/SvcMemory.cs b/Ryujinx.HLE/HOS/Kernel/SupervisorCall/SvcMemory.cs index ccb5d0b1eb..b8b10b9d2c 100644 --- a/Ryujinx.HLE/HOS/Kernel/SupervisorCall/SvcMemory.cs +++ b/Ryujinx.HLE/HOS/Kernel/SupervisorCall/SvcMemory.cs @@ -412,6 +412,19 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall return KernelResult.InvalidHandle; } + if (targetProcess.MemoryManager.OutsideAddrSpace(dst, size) || + targetProcess.MemoryManager.OutsideAddrSpace(src, size) || + targetProcess.MemoryManager.InsideAliasRegion(dst, size) || + targetProcess.MemoryManager.InsideHeapRegion(dst, size)) + { + return KernelResult.InvalidMemRange; + } + + if (size + dst <= dst || size + src <= src) + { + return KernelResult.InvalidMemState; + } + return targetProcess.MemoryManager.MapProcessCodeMemory(dst, src, size); } @@ -441,6 +454,19 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall return KernelResult.InvalidHandle; } + if (targetProcess.MemoryManager.OutsideAddrSpace(dst, size) || + targetProcess.MemoryManager.OutsideAddrSpace(src, size) || + targetProcess.MemoryManager.InsideAliasRegion(dst, size) || + targetProcess.MemoryManager.InsideHeapRegion(dst, size)) + { + return KernelResult.InvalidMemRange; + } + + if (size + dst <= dst || size + src <= src) + { + return KernelResult.InvalidMemState; + } + return targetProcess.MemoryManager.UnmapProcessCodeMemory(dst, src, size); } @@ -461,6 +487,11 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall return KernelResult.InvalidSize; } + if (permission > MemoryPermission.ReadAndExecute || ((1 << (int)permission) & 0x2B) == 0) + { + return KernelResult.InvalidPermission; + } + KProcess currentProcess = _system.Scheduler.GetCurrentProcess(); KProcess targetProcess = currentProcess.HandleTable.GetObject(handle);