From 1383e17341b900ce857ea2916fb0ea5df7c31d1a Mon Sep 17 00:00:00 2001 From: Billy Laws Date: Mon, 6 Jul 2020 17:23:47 +0100 Subject: [PATCH] Mark CodeStatic regions that are writable as CodeMutable instead This is required for applications that attempt to map from the bss. --- app/src/main/cpp/skyline/kernel/types/KPrivateMemory.cpp | 5 +++++ app/src/main/cpp/skyline/loader/loader.cpp | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/app/src/main/cpp/skyline/kernel/types/KPrivateMemory.cpp b/app/src/main/cpp/skyline/kernel/types/KPrivateMemory.cpp index 8ab73650..fb2725a9 100644 --- a/app/src/main/cpp/skyline/kernel/types/KPrivateMemory.cpp +++ b/app/src/main/cpp/skyline/kernel/types/KPrivateMemory.cpp @@ -126,6 +126,11 @@ namespace skyline::kernel::type { throw exception("An error occurred while updating private memory's permissions in child process"); auto chunk = state.os->memory.GetChunk(address); + + // If a static code region has been mapped as writable it needs to be changed to mutable + if (chunk->state.value == memory::states::CodeStatic.value && permission.w) + chunk->state = memory::states::CodeMutable; + BlockDescriptor block{ .address = address, .size = size, diff --git a/app/src/main/cpp/skyline/loader/loader.cpp b/app/src/main/cpp/skyline/loader/loader.cpp index 31f623c6..c1d73705 100644 --- a/app/src/main/cpp/skyline/loader/loader.cpp +++ b/app/src/main/cpp/skyline/loader/loader.cpp @@ -33,10 +33,10 @@ namespace skyline::loader { process->NewHandle(base + executable.ro.offset, roSize, memory::Permission{true, false, false}, memory::states::CodeReadOnly); // R-- state.logger->Debug("Successfully mapped section .rodata @ 0x{0:X}, Size = 0x{1:X}", base + executable.ro.offset, roSize); - process->NewHandle(base + executable.data.offset, dataSize, memory::Permission{true, true, false}, memory::states::CodeStatic); // RW- + process->NewHandle(base + executable.data.offset, dataSize, memory::Permission{true, true, false}, memory::states::CodeMutable); // RW- state.logger->Debug("Successfully mapped section .data @ 0x{0:X}, Size = 0x{1:X}", base + executable.data.offset, dataSize); - process->NewHandle(base + patchOffset, patchSize + padding, memory::Permission{true, true, true}, memory::states::CodeStatic); // RWX + process->NewHandle(base + patchOffset, patchSize + padding, memory::Permission{true, true, true}, memory::states::CodeMutable); // RWX state.logger->Debug("Successfully mapped section .patch @ 0x{0:X}, Size = 0x{1:X}", base + patchOffset, patchSize + padding); process->WriteMemory(executable.text.contents.data(), base + executable.text.offset, textSize);