From ccbbaddbcb6a0eb0cee0d2e2482546611237bee3 Mon Sep 17 00:00:00 2001
From: gdkchan <gab.dark.100@gmail.com>
Date: Mon, 29 Jan 2024 21:19:39 -0300
Subject: Fix exception when trying to read output pointer buffer size (#6221)

* Fix exception when trying to read output pointer buffer size

* Better name
---
 src/Ryujinx.Horizon/Sdk/Sf/Hipc/HipcMessage.cs     | 3 +++
 src/Ryujinx.Horizon/Sdk/Sf/Hipc/HipcMessageData.cs | 1 +
 src/Ryujinx.Horizon/Sdk/Sf/HipcCommandProcessor.cs | 2 +-
 3 files changed, 5 insertions(+), 1 deletion(-)

(limited to 'src')

diff --git a/src/Ryujinx.Horizon/Sdk/Sf/Hipc/HipcMessage.cs b/src/Ryujinx.Horizon/Sdk/Sf/Hipc/HipcMessage.cs
index 887c82eb..73321a89 100644
--- a/src/Ryujinx.Horizon/Sdk/Sf/Hipc/HipcMessage.cs
+++ b/src/Ryujinx.Horizon/Sdk/Sf/Hipc/HipcMessage.cs
@@ -181,6 +181,7 @@ namespace Ryujinx.Horizon.Sdk.Sf.Hipc
             }
 
             Span<uint> dataWords = Span<uint>.Empty;
+            Span<uint> dataWordsPadded = Span<uint>.Empty;
 
             if (meta.DataWordsCount != 0)
             {
@@ -189,6 +190,7 @@ namespace Ryujinx.Horizon.Sdk.Sf.Hipc
                 int padding = (dataOffsetAligned - dataOffset) / sizeof(uint);
 
                 dataWords = MemoryMarshal.Cast<byte, uint>(data)[padding..meta.DataWordsCount];
+                dataWordsPadded = MemoryMarshal.Cast<byte, uint>(data)[..meta.DataWordsCount];
 
                 data = data[(meta.DataWordsCount * sizeof(uint))..];
             }
@@ -209,6 +211,7 @@ namespace Ryujinx.Horizon.Sdk.Sf.Hipc
                 ReceiveBuffers = receiveBuffers,
                 ExchangeBuffers = exchangeBuffers,
                 DataWords = dataWords,
+                DataWordsPadded = dataWordsPadded,
                 ReceiveList = receiveList,
                 CopyHandles = copyHandles,
                 MoveHandles = moveHandles,
diff --git a/src/Ryujinx.Horizon/Sdk/Sf/Hipc/HipcMessageData.cs b/src/Ryujinx.Horizon/Sdk/Sf/Hipc/HipcMessageData.cs
index 548f12e8..0d45d756 100644
--- a/src/Ryujinx.Horizon/Sdk/Sf/Hipc/HipcMessageData.cs
+++ b/src/Ryujinx.Horizon/Sdk/Sf/Hipc/HipcMessageData.cs
@@ -9,6 +9,7 @@ namespace Ryujinx.Horizon.Sdk.Sf.Hipc
         public Span<HipcBufferDescriptor> ReceiveBuffers;
         public Span<HipcBufferDescriptor> ExchangeBuffers;
         public Span<uint> DataWords;
+        public Span<uint> DataWordsPadded;
         public Span<HipcReceiveListEntry> ReceiveList;
         public Span<int> CopyHandles;
         public Span<int> MoveHandles;
diff --git a/src/Ryujinx.Horizon/Sdk/Sf/HipcCommandProcessor.cs b/src/Ryujinx.Horizon/Sdk/Sf/HipcCommandProcessor.cs
index bb9b37e2..f7694a74 100644
--- a/src/Ryujinx.Horizon/Sdk/Sf/HipcCommandProcessor.cs
+++ b/src/Ryujinx.Horizon/Sdk/Sf/HipcCommandProcessor.cs
@@ -206,7 +206,7 @@ namespace Ryujinx.Horizon.Sdk.Sf
                         }
                         else
                         {
-                            var data = MemoryMarshal.Cast<uint, byte>(context.Request.Data.DataWords);
+                            var data = MemoryMarshal.Cast<uint, byte>(context.Request.Data.DataWordsPadded);
                             var recvPointerSizes = MemoryMarshal.Cast<byte, ushort>(data[runtimeMetadata.UnfixedOutPointerSizeOffset..]);
 
                             size = recvPointerSizes[unfixedRecvPointerIndex++];
-- 
cgit v1.2.3-70-g09d2