diff options
author | Lioncash <mathew1800@gmail.com> | 2018-09-14 01:14:50 +0200 |
---|---|---|
committer | Lioncash <mathew1800@gmail.com> | 2018-09-14 03:34:54 +0200 |
commit | 496c67fd730cd27ed1a6ce087d224bd2b736ad4b (patch) | |
tree | cc0ef852762ae9a01ac83634b890db951428200c | |
parent | kernel/svc: Sanitize heap sizes within svcSetHeapSize() (diff) | |
download | yuzu-496c67fd730cd27ed1a6ce087d224bd2b736ad4b.tar yuzu-496c67fd730cd27ed1a6ce087d224bd2b736ad4b.tar.gz yuzu-496c67fd730cd27ed1a6ce087d224bd2b736ad4b.tar.bz2 yuzu-496c67fd730cd27ed1a6ce087d224bd2b736ad4b.tar.lz yuzu-496c67fd730cd27ed1a6ce087d224bd2b736ad4b.tar.xz yuzu-496c67fd730cd27ed1a6ce087d224bd2b736ad4b.tar.zst yuzu-496c67fd730cd27ed1a6ce087d224bd2b736ad4b.zip |
-rw-r--r-- | src/core/hle/kernel/svc.cpp | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/src/core/hle/kernel/svc.cpp b/src/core/hle/kernel/svc.cpp index a3d169e46..3eb77812e 100644 --- a/src/core/hle/kernel/svc.cpp +++ b/src/core/hle/kernel/svc.cpp @@ -35,6 +35,11 @@ #include "core/hle/service/service.h" namespace Kernel { +namespace { +constexpr bool Is4KBAligned(VAddr address) { + return (address & 0xFFF) == 0; +} +} // Anonymous namespace /// Set the process heap to a given Size. It can both extend and shrink the heap. static ResultCode SetHeapSize(VAddr* heap_addr, u64 heap_size) { @@ -62,6 +67,15 @@ static ResultCode SetMemoryAttribute(VAddr addr, u64 size, u32 state0, u32 state static ResultCode MapMemory(VAddr dst_addr, VAddr src_addr, u64 size) { LOG_TRACE(Kernel_SVC, "called, dst_addr=0x{:X}, src_addr=0x{:X}, size=0x{:X}", dst_addr, src_addr, size); + + if (!Is4KBAligned(dst_addr) || !Is4KBAligned(src_addr)) { + return ERR_INVALID_ADDRESS; + } + + if (size == 0 || !Is4KBAligned(size)) { + return ERR_INVALID_SIZE; + } + return Core::CurrentProcess()->MirrorMemory(dst_addr, src_addr, size); } @@ -69,6 +83,15 @@ static ResultCode MapMemory(VAddr dst_addr, VAddr src_addr, u64 size) { static ResultCode UnmapMemory(VAddr dst_addr, VAddr src_addr, u64 size) { LOG_TRACE(Kernel_SVC, "called, dst_addr=0x{:X}, src_addr=0x{:X}, size=0x{:X}", dst_addr, src_addr, size); + + if (!Is4KBAligned(dst_addr) || !Is4KBAligned(src_addr)) { + return ERR_INVALID_ADDRESS; + } + + if (size == 0 || !Is4KBAligned(size)) { + return ERR_INVALID_SIZE; + } + return Core::CurrentProcess()->UnmapMemory(dst_addr, src_addr, size); } |