kernel/svc: Sanitize creation of shared memory via svcCreateSharedMemory()
The kernel caps the size limit of shared memory to 8589930496 bytes (or (1GB - 512 bytes) * 8), so approximately 8GB, where every GB has a 512 byte sector taken off of it. It also ensures the shared memory is created with either read or read/write permissions for both permission types passed in, allowing the remote permissions to also be set as "don't care".
This commit is contained in:
parent
accd1f17e4
commit
4f8756edd0
|
@ -935,12 +935,28 @@ static ResultCode CreateSharedMemory(Handle* handle, u64 size, u32 local_permiss
|
||||||
LOG_TRACE(Kernel_SVC, "called, size=0x{:X}, localPerms=0x{:08X}, remotePerms=0x{:08X}", size,
|
LOG_TRACE(Kernel_SVC, "called, size=0x{:X}, localPerms=0x{:08X}, remotePerms=0x{:08X}", size,
|
||||||
local_permissions, remote_permissions);
|
local_permissions, remote_permissions);
|
||||||
|
|
||||||
|
// Size must be a multiple of 4KB and be less than or equal to
|
||||||
|
// approx. 8 GB (actually (1GB - 512B) * 8)
|
||||||
|
if (size == 0 || (size & 0xFFFFFFFE00000FFF) != 0) {
|
||||||
|
return ERR_INVALID_SIZE;
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto local_perms = static_cast<MemoryPermission>(local_permissions);
|
||||||
|
if (local_perms != MemoryPermission::Read && local_perms != MemoryPermission::ReadWrite) {
|
||||||
|
return ERR_INVALID_MEMORY_PERMISSIONS;
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto remote_perms = static_cast<MemoryPermission>(remote_permissions);
|
||||||
|
if (remote_perms != MemoryPermission::Read && remote_perms != MemoryPermission::ReadWrite &&
|
||||||
|
remote_perms != MemoryPermission::DontCare) {
|
||||||
|
return ERR_INVALID_MEMORY_PERMISSIONS;
|
||||||
|
}
|
||||||
|
|
||||||
auto& kernel = Core::System::GetInstance().Kernel();
|
auto& kernel = Core::System::GetInstance().Kernel();
|
||||||
auto& handle_table = kernel.HandleTable();
|
auto& handle_table = kernel.HandleTable();
|
||||||
auto shared_mem_handle =
|
auto shared_mem_handle =
|
||||||
SharedMemory::Create(kernel, handle_table.Get<Process>(KernelHandle::CurrentProcess), size,
|
SharedMemory::Create(kernel, handle_table.Get<Process>(KernelHandle::CurrentProcess), size,
|
||||||
static_cast<MemoryPermission>(local_permissions),
|
local_perms, remote_perms);
|
||||||
static_cast<MemoryPermission>(remote_permissions));
|
|
||||||
|
|
||||||
CASCADE_RESULT(*handle, handle_table.Create(shared_mem_handle));
|
CASCADE_RESULT(*handle, handle_table.Create(shared_mem_handle));
|
||||||
return RESULT_SUCCESS;
|
return RESULT_SUCCESS;
|
||||||
|
|
Reference in New Issue