From e9af4c160678879cb1cab877f1611708ec28eb3f Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Thu, 18 Jan 2024 13:08:42 -0800 Subject: [PATCH] Linux: Disable EFAULT handler until we find something that uses it. --- .../LinuxSyscalls/SignalDelegator.cpp | 13 ++++++++++--- .../tests/syscalls/syscalls_efault.cpp | 2 +- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/Source/Tools/LinuxEmulation/LinuxSyscalls/SignalDelegator.cpp b/Source/Tools/LinuxEmulation/LinuxSyscalls/SignalDelegator.cpp index c3c435026a..96900a1e19 100644 --- a/Source/Tools/LinuxEmulation/LinuxSyscalls/SignalDelegator.cpp +++ b/Source/Tools/LinuxEmulation/LinuxSyscalls/SignalDelegator.cpp @@ -1471,9 +1471,16 @@ namespace FEX::HLE { else if (Signal == SIGSEGV && (reinterpret_cast(ArchHelpers::Context::GetPc(UContext)) == FaultSafeMemcpy::CopyFromUser_FaultLocation || reinterpret_cast(ArchHelpers::Context::GetPc(UContext)) == FaultSafeMemcpy::CopyToUser_FaultLocation)) { - // Jump to the copy fault handler return trampoline to safely return EFAULT. - ArchHelpers::Context::SetPc(UContext, reinterpret_cast(&FaultSafeMemcpy::CopyFaultTrampoline)); - return; + // If you want to emulate EFAULT behaviour then enable this if-statement. + // Do this once we find an application that depends on this. + if constexpr (false) { + // Jump to the copy fault handler return trampoline to safely return EFAULT. + ArchHelpers::Context::SetPc(UContext, reinterpret_cast(&FaultSafeMemcpy::CopyFaultTrampoline)); + return; + } + else { + LogMan::Msg::AFmt("Received invalid data to syscall. Crashing now!"); + } } else { if (IsAsyncSignal(&SigInfo, Signal) && MustDeferSignal) { diff --git a/unittests/FEXLinuxTests/tests/syscalls/syscalls_efault.cpp b/unittests/FEXLinuxTests/tests/syscalls/syscalls_efault.cpp index 45d559b2e0..b81192bf35 100644 --- a/unittests/FEXLinuxTests/tests/syscalls/syscalls_efault.cpp +++ b/unittests/FEXLinuxTests/tests/syscalls/syscalls_efault.cpp @@ -15,7 +15,7 @@ TEST_CASE("poll") { CHECK(errno == EFAULT); } -TEST_CASE("ppoll") { +TEST_CASE("ppoll", "[!mayfail]") { // ppoll can return EFAULT for arguements 1, 3, 4 struct pollfd *invalid_fds = reinterpret_cast(mmap(nullptr, sysconf(_SC_PAGESIZE), PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0)); struct timespec *invalid_timespec = reinterpret_cast(mmap(nullptr, sysconf(_SC_PAGESIZE), PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0));