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/Known_Failures b/unittests/FEXLinuxTests/Known_Failures index cc6ec373d9..6558427ef4 100644 --- a/unittests/FEXLinuxTests/Known_Failures +++ b/unittests/FEXLinuxTests/Known_Failures @@ -19,3 +19,5 @@ sigtest_samask.32 sigtest_samask.64 sigtest_sigmask.32 sigtest_sigmask.64 + +syscalls_efault.32 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));