Просмотр исходного кода

Avoid LM service crashes by not reading more than the buffer size (#4701)

gdkchan 3 лет назад
Родитель
Сommit
add2a9d151
2 измененных файлов с 11 добавлено и 6 удалено
  1. 5 0
      Ryujinx.Common/Memory/SpanReader.cs
  2. 6 6
      Ryujinx.Horizon/LogManager/Ipc/LmLogger.cs

+ 5 - 0
Ryujinx.Common/Memory/SpanReader.cs

@@ -33,6 +33,11 @@ namespace Ryujinx.Common.Memory
             return data;
         }
 
+        public ReadOnlySpan<byte> GetSpanSafe(int size)
+        {
+            return GetSpan((int)Math.Min((uint)_input.Length, (uint)size));
+        }
+
         public T ReadAt<T>(int offset) where T : unmanaged
         {
             return MemoryMarshal.Cast<byte, T>(_input.Slice(offset))[0];

+ 6 - 6
Ryujinx.Horizon/LogManager/Ipc/LmLogger.cs

@@ -113,7 +113,7 @@ namespace Ryujinx.Horizon.LogManager.Ipc
                 }
                 else if (key == LogDataChunkKey.Message)
                 {
-                    string text = Encoding.UTF8.GetString(reader.GetSpan(size)).TrimEnd();
+                    string text = Encoding.UTF8.GetString(reader.GetSpanSafe(size)).TrimEnd();
 
                     if (isHeadPacket && isTailPacket)
                     {
@@ -131,23 +131,23 @@ namespace Ryujinx.Horizon.LogManager.Ipc
                 }
                 else if (key == LogDataChunkKey.Filename)
                 {
-                    _logPacket.Filename = Encoding.UTF8.GetString(reader.GetSpan(size)).TrimEnd();
+                    _logPacket.Filename = Encoding.UTF8.GetString(reader.GetSpanSafe(size)).TrimEnd();
                 }
                 else if (key == LogDataChunkKey.Function)
                 {
-                    _logPacket.Function = Encoding.UTF8.GetString(reader.GetSpan(size)).TrimEnd();
+                    _logPacket.Function = Encoding.UTF8.GetString(reader.GetSpanSafe(size)).TrimEnd();
                 }
                 else if (key == LogDataChunkKey.Module)
                 {
-                    _logPacket.Module = Encoding.UTF8.GetString(reader.GetSpan(size)).TrimEnd();
+                    _logPacket.Module = Encoding.UTF8.GetString(reader.GetSpanSafe(size)).TrimEnd();
                 }
                 else if (key == LogDataChunkKey.Thread)
                 {
-                    _logPacket.Thread = Encoding.UTF8.GetString(reader.GetSpan(size)).TrimEnd();
+                    _logPacket.Thread = Encoding.UTF8.GetString(reader.GetSpanSafe(size)).TrimEnd();
                 }
                 else if (key == LogDataChunkKey.ProgramName)
                 {
-                    _logPacket.ProgramName = Encoding.UTF8.GetString(reader.GetSpan(size)).TrimEnd();
+                    _logPacket.ProgramName = Encoding.UTF8.GetString(reader.GetSpanSafe(size)).TrimEnd();
                 }
             }