From 486332399321ac251a183bf494d4e8da5555b2cf Mon Sep 17 00:00:00 2001 From: Pavel Djundik Date: Mon, 5 Feb 2024 14:16:07 +0200 Subject: [PATCH 1/4] Specify decompressed capacity --- SteamKit2/SteamKit2/Steam/CMClient.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SteamKit2/SteamKit2/Steam/CMClient.cs b/SteamKit2/SteamKit2/Steam/CMClient.cs index e92eda913..93af3a5e3 100644 --- a/SteamKit2/SteamKit2/Steam/CMClient.cs +++ b/SteamKit2/SteamKit2/Steam/CMClient.cs @@ -529,7 +529,7 @@ void HandleMulti( IPacketMsg packetMsg ) { using var compressedStream = new MemoryStream( payload ); using var gzipStream = new GZipStream( compressedStream, CompressionMode.Decompress ); - using var decompressedStream = new MemoryStream(); + using var decompressedStream = new MemoryStream( capacity: ( int )msgMulti.Body.size_unzipped ); gzipStream.CopyTo( decompressedStream ); payload = decompressedStream.ToArray(); } From eee385f74806bb1541a5898bcaaca965b5939076 Mon Sep 17 00:00:00 2001 From: Pavel Djundik Date: Mon, 5 Feb 2024 14:16:45 +0200 Subject: [PATCH 2/4] Add fast path for ReadNullTermString UTF8 --- SteamKit2/SteamKit2/Util/StreamHelpers.cs | 43 +++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/SteamKit2/SteamKit2/Util/StreamHelpers.cs b/SteamKit2/SteamKit2/Util/StreamHelpers.cs index 42b8efdb7..4105e52e0 100644 --- a/SteamKit2/SteamKit2/Util/StreamHelpers.cs +++ b/SteamKit2/SteamKit2/Util/StreamHelpers.cs @@ -1,4 +1,5 @@ using System; +using System.Buffers; using System.Diagnostics.CodeAnalysis; using System.IO; using System.Text; @@ -74,6 +75,11 @@ public static float ReadFloat( this Stream stream ) public static string ReadNullTermString( this Stream stream, Encoding encoding ) { + if ( encoding == Encoding.UTF8 ) + { + return ReadNullTermUtf8String( stream ); + } + int characterSize = encoding.GetByteCount( "e" ); using MemoryStream ms = new MemoryStream(); @@ -94,6 +100,43 @@ public static string ReadNullTermString( this Stream stream, Encoding encoding ) return encoding.GetString( ms.GetBuffer(), 0, ( int )ms.Length ); } + private static string ReadNullTermUtf8String( Stream stream ) + { + var buffer = ArrayPool.Shared.Rent( 32 ); + + try + { + var position = 0; + + do + { + var b = ( byte )stream.ReadByte(); + + if ( b == 0x00 ) + { + break; + } + + if ( position >= buffer.Length ) + { + var newBuffer = ArrayPool.Shared.Rent( buffer.Length * 2 ); + Buffer.BlockCopy( buffer, 0, newBuffer, 0, buffer.Length ); + ArrayPool.Shared.Return( buffer ); + buffer = newBuffer; + } + + buffer[ position++ ] = b; + } + while ( true ); + + return Encoding.UTF8.GetString( buffer[ ..position ] ); + } + finally + { + ArrayPool.Shared.Return( buffer ); + } + } + public static void WriteNullTermString( this Stream stream, string value, Encoding encoding ) { var dataLength = encoding.GetByteCount( value ); From 21fe9567445510cf2d6e27c3a7cf3368da6a7b82 Mon Sep 17 00:00:00 2001 From: Pavel Djundik Date: Mon, 5 Feb 2024 14:19:44 +0200 Subject: [PATCH 3/4] Remove unnecessary allocation in CallbackMgr.Handle --- .../Steam/SteamClient/CallbackMgr/CallbackMgr.cs | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/SteamKit2/SteamKit2/Steam/SteamClient/CallbackMgr/CallbackMgr.cs b/SteamKit2/SteamKit2/Steam/SteamClient/CallbackMgr/CallbackMgr.cs index dc88b479b..8d34a7010 100644 --- a/SteamKit2/SteamKit2/Steam/SteamClient/CallbackMgr/CallbackMgr.cs +++ b/SteamKit2/SteamKit2/Steam/SteamClient/CallbackMgr/CallbackMgr.cs @@ -129,9 +129,14 @@ void ICallbackMgrInternals.Register( CallbackBase call ) void Handle( ICallbackMsg call ) { - registeredCallbacks - .FindAll( callback => callback.CallbackType.IsAssignableFrom( call.GetType() ) ) // find handlers interested in this callback - .ForEach( callback => callback.Run( call ) ); // run them + // find handlers interested in this callback + foreach ( var callback in registeredCallbacks ) + { + if ( callback.CallbackType.IsAssignableFrom( call.GetType() ) ) + { + callback.Run( call ); + } + } } void ICallbackMgrInternals.Unregister( CallbackBase call ) From 43ecd71e1069e4a136ef53acdb07bf96d79f46e5 Mon Sep 17 00:00:00 2001 From: Pavel Djundik Date: Mon, 5 Feb 2024 14:31:59 +0200 Subject: [PATCH 4/4] Handle truncated stream --- SteamKit2/SteamKit2/Util/StreamHelpers.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/SteamKit2/SteamKit2/Util/StreamHelpers.cs b/SteamKit2/SteamKit2/Util/StreamHelpers.cs index 4105e52e0..b442134d3 100644 --- a/SteamKit2/SteamKit2/Util/StreamHelpers.cs +++ b/SteamKit2/SteamKit2/Util/StreamHelpers.cs @@ -110,9 +110,9 @@ private static string ReadNullTermUtf8String( Stream stream ) do { - var b = ( byte )stream.ReadByte(); + var b = stream.ReadByte(); - if ( b == 0x00 ) + if ( b <= 0 ) // null byte or stream ended { break; } @@ -125,7 +125,7 @@ private static string ReadNullTermUtf8String( Stream stream ) buffer = newBuffer; } - buffer[ position++ ] = b; + buffer[ position++ ] = (byte)b; } while ( true );