From 9034a4e523a62d01958dd2290bb45e44f1f0cc8e Mon Sep 17 00:00:00 2001 From: Thog Date: Wed, 13 Feb 2019 01:48:11 +0100 Subject: [PATCH] Address comments --- Ryujinx.HLE/FileSystem/FileSystemProvider.cs | 1 - .../HOS/Kernel/SupervisorCall/SvcMemory.cs | 31 +++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) 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);