Skip to content

Commit 0ec1bfc

Browse files
committed
Added safety checks to not send garbage bits
1 parent d4871e7 commit 0ec1bfc

File tree

3 files changed

+20
-4
lines changed

3 files changed

+20
-4
lines changed

MLAPI/Data/NetworkConfig.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,7 @@ public string ToBase64()
221221
writer.WriteBool(config.EnableSceneSwitching);
222222
writer.WriteBool(config.EnableTimeResync);
223223
writer.WriteBits((byte)config.AttributeMessageMode, 3);
224+
stream.ZeroLastByteGarbageBits();
224225

225226
return Convert.ToBase64String(stream.ToArray());
226227
}
@@ -353,7 +354,7 @@ public ulong GetConfig(bool cache = true)
353354
writer.WriteBool(EnableSceneSwitching);
354355
writer.WriteBool(SignKeyExchange);
355356
writer.WriteBits((byte)AttributeMessageMode, 3);
356-
writer.WritePadBits();
357+
stream.ZeroLastByteGarbageBits();
357358

358359
if (cache)
359360
{

MLAPI/NetworkingManagerComponents/Binary/BitStream.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -439,6 +439,16 @@ public byte[] ToArray()
439439
return copy;
440440
}
441441

442+
/// <summary>
443+
/// Sets the unused bits of the last byte to 0s
444+
/// </summary>
445+
public void ZeroLastByteGarbageBits()
446+
{
447+
if (BitAligned) return;
448+
449+
target[Length] &= (byte)~(0xFF << (int)(BitLength % 8));
450+
}
451+
442452
/// <summary>
443453
/// Returns hex encoded version of the buffer
444454
/// </summary>

MLAPI/NetworkingManagerComponents/Core/InternalMessageHandler.Send.cs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
1-
using System.IO;
2-
using System.Security.Cryptography;
3-
using MLAPI.Data;
1+
using MLAPI.Data;
42
using MLAPI.Profiling;
53
using MLAPI.Serialization;
64

@@ -10,7 +8,10 @@ internal static partial class InternalMessageHandler
108
{
119
internal static void Send(uint clientId, byte messageType, string channelName, BitStream messageStream, SecuritySendFlags flags, bool skipQueue = false)
1210
{
11+
messageStream.ZeroLastByteGarbageBits();
12+
1313
if (NetworkingManager.singleton.isServer && clientId == NetworkingManager.singleton.ServerClientId) return;
14+
1415
using (BitStream stream = MessageManager.WrapMessage(messageType, clientId, messageStream, flags))
1516
{
1617
NetworkProfiler.StartEvent(TickType.Send, (uint)stream.Length, channelName, MLAPIConstants.MESSAGE_NAMES[messageType]);
@@ -37,6 +38,8 @@ internal static void Send(byte messageType, string channelName, BitStream messag
3738
}
3839
else
3940
{
41+
messageStream.ZeroLastByteGarbageBits();
42+
4043
using (BitStream stream = MessageManager.WrapMessage(messageType, 0, messageStream, flags))
4144
{
4245
NetworkProfiler.StartEvent(TickType.Send, (uint)stream.Length, channelName, MLAPIConstants.MESSAGE_NAMES[messageType]);
@@ -68,6 +71,8 @@ internal static void Send(byte messageType, string channelName, uint clientIdToI
6871
}
6972
else
7073
{
74+
messageStream.ZeroLastByteGarbageBits();
75+
7176
using (BitStream stream = MessageManager.WrapMessage(messageType, 0, messageStream, flags))
7277
{
7378
NetworkProfiler.StartEvent(TickType.Send, (uint)stream.Length, channelName, MLAPIConstants.MESSAGE_NAMES[messageType]);

0 commit comments

Comments
 (0)