From 9bad71afbf59abf93f14f3d4d0af5970612900c3 Mon Sep 17 00:00:00 2001 From: Mary-nyan Date: Fri, 26 Aug 2022 18:10:45 +0200 Subject: [PATCH] bsd: Fix Poll writting in input buffer (#3630) This is a very old oversight on our Poll implementation. This worked so far reliably because games and homebrews pass the same buffer as input and output. --- Ryujinx.HLE/HOS/Services/Sockets/Bsd/IClient.cs | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/Ryujinx.HLE/HOS/Services/Sockets/Bsd/IClient.cs b/Ryujinx.HLE/HOS/Services/Sockets/Bsd/IClient.cs index ae245ec8..4e1bb12f 100644 --- a/Ryujinx.HLE/HOS/Services/Sockets/Bsd/IClient.cs +++ b/Ryujinx.HLE/HOS/Services/Sockets/Bsd/IClient.cs @@ -219,9 +219,10 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd int fdsCount = context.RequestData.ReadInt32(); int timeout = context.RequestData.ReadInt32(); - (ulong bufferPosition, ulong bufferSize) = context.Request.GetBufferType0x21(); + (ulong inputBufferPosition, ulong inputBufferSize) = context.Request.GetBufferType0x21(); + (ulong outputBufferPosition, ulong outputBufferSize) = context.Request.GetBufferType0x22(); - if (timeout < -1 || fdsCount < 0 || (ulong)(fdsCount * 8) > bufferSize) + if (timeout < -1 || fdsCount < 0 || (ulong)(fdsCount * 8) > inputBufferSize) { return WriteBsdResult(context, -1, LinuxError.EINVAL); } @@ -230,7 +231,7 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd for (int i = 0; i < fdsCount; i++) { - PollEventData pollEventData = context.Memory.Read(bufferPosition + (ulong)(i * Unsafe.SizeOf())); + PollEventData pollEventData = context.Memory.Read(inputBufferPosition + (ulong)(i * Unsafe.SizeOf())); IFileDescriptor fileDescriptor = _context.RetrieveFileDescriptor(pollEventData.SocketFd); @@ -277,7 +278,7 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd { bool IsUnexpectedLinuxError(LinuxError error) { - return errno != LinuxError.SUCCESS && errno != LinuxError.ETIMEDOUT; + return error != LinuxError.SUCCESS && error != LinuxError.ETIMEDOUT; } // Hybrid approach @@ -332,7 +333,7 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd // TODO: Spanify for (int i = 0; i < fdsCount; i++) { - context.Memory.Write(bufferPosition + (ulong)(i * Unsafe.SizeOf()), events[i].Data); + context.Memory.Write(outputBufferPosition + (ulong)(i * Unsafe.SizeOf()), events[i].Data); } return WriteBsdResult(context, updateCount, errno);