Ver Fonte

Fix exception when trying to read output pointer buffer size (#6221)

* Fix exception when trying to read output pointer buffer size

* Better name
gdkchan há 2 anos atrás
pai
commit
ccbbaddbcb

+ 3 - 0
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,

+ 1 - 0
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;

+ 1 - 1
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++];