From 3459369c6e8277ff707d1c15a4d5b754b85df760 Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Sun, 25 Aug 2024 02:03:44 -0700 Subject: [PATCH] x64/Signals: Add EFAULT checks --- Source/Tools/LinuxEmulation/LinuxSyscalls/x64/Signals.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Source/Tools/LinuxEmulation/LinuxSyscalls/x64/Signals.cpp b/Source/Tools/LinuxEmulation/LinuxSyscalls/x64/Signals.cpp index 30737c7e3..d8754ccbc 100644 --- a/Source/Tools/LinuxEmulation/LinuxSyscalls/x64/Signals.cpp +++ b/Source/Tools/LinuxEmulation/LinuxSyscalls/x64/Signals.cpp @@ -25,6 +25,8 @@ void RegisterSignals(FEX::HLE::SyscallHandler* Handler) { if (sigsetsize != 8) { return -EINVAL; } + FaultSafeUserMemAccess::VerifyIsReadableOrNull(act, sizeof(GuestSigAction)); + FaultSafeUserMemAccess::VerifyIsWritableOrNull(oldact, sizeof(GuestSigAction)); return FEX::HLE::_SyscallHandler->GetSignalDelegator()->RegisterGuestSignalHandler(signum, act, oldact); }); @@ -32,6 +34,9 @@ void RegisterSignals(FEX::HLE::SyscallHandler* Handler) { REGISTER_SYSCALL_IMPL_X64( rt_sigtimedwait, [](FEXCore::Core::CpuStateFrame* Frame, uint64_t* set, siginfo_t* info, const struct timespec* timeout, size_t sigsetsize) -> uint64_t { + FaultSafeUserMemAccess::VerifyIsReadable(set, sizeof(sigsetsize)); + FaultSafeUserMemAccess::VerifyIsWritableOrNull(info, sizeof(siginfo_t)); + FaultSafeUserMemAccess::VerifyIsReadableOrNull(timeout, sizeof(timespec)); return FEX::HLE::_SyscallHandler->GetSignalDelegator()->GuestSigTimedWait(set, info, timeout, sigsetsize); }); }