From a43ddba87c72ab4112b16f7de41bbe5be8472b3e Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Thu, 10 Apr 2025 13:08:06 -0700 Subject: [PATCH] LinuxSyscalls: Fixes 32-bit llseek result `llseek` returns only ever 0 or errno in the return register. This is in contrast to `lseek` which returns the result (or errno) in the return register. We were accidentally returning the result on non-error conditions which could freak out some software. Thanks to [OFFTKP](https://github.com/OFFTKP) for pointing out this issue --- Source/Tools/LinuxEmulation/LinuxSyscalls/x32/FD.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Source/Tools/LinuxEmulation/LinuxSyscalls/x32/FD.cpp b/Source/Tools/LinuxEmulation/LinuxSyscalls/x32/FD.cpp index 9d9525a23..4e73c789f 100644 --- a/Source/Tools/LinuxEmulation/LinuxSyscalls/x32/FD.cpp +++ b/Source/Tools/LinuxEmulation/LinuxSyscalls/x32/FD.cpp @@ -293,6 +293,8 @@ void RegisterFD(FEX::HLE::SyscallHandler* Handler) { if (Result != -1) { FaultSafeUserMemAccess::VerifyIsWritable(result, sizeof(*result)); *result = Result; + // On non-error result, llseek returns zero (As the result is returned in pointer). + return 0; } SYSCALL_ERRNO(); });