diff options
author | Mary-nyan <mary@mary.zone> | 2022-08-26 18:10:45 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-08-26 18:10:45 +0200 |
commit | 9bad71afbf59abf93f14f3d4d0af5970612900c3 (patch) | |
tree | 4b7307ea8763e1f440117e333ce7eb0ca2f4960c | |
parent | 923089a29825cad8159a63616d14dcbd7161cb3c (diff) |
bsd: Fix Poll writting in input buffer (#3630)1.1.234
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.
-rw-r--r-- | Ryujinx.HLE/HOS/Services/Sockets/Bsd/IClient.cs | 11 |
1 files 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<PollEventData>(bufferPosition + (ulong)(i * Unsafe.SizeOf<PollEventData>())); + PollEventData pollEventData = context.Memory.Read<PollEventData>(inputBufferPosition + (ulong)(i * Unsafe.SizeOf<PollEventData>())); 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<PollEventData>()), events[i].Data); + context.Memory.Write(outputBufferPosition + (ulong)(i * Unsafe.SizeOf<PollEventData>()), events[i].Data); } return WriteBsdResult(context, updateCount, errno); |