Skip to content

Commit 44fed18

Browse files
committed
fix: Added recursion checks to buffering to ensure we only buffer once (rare)
1 parent 173aeaf commit 44fed18

File tree

3 files changed

+14
-9
lines changed

3 files changed

+14
-9
lines changed

MLAPI/Core/NetworkingManager.cs

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -849,7 +849,7 @@ private void HandleRawTransportPoll(NetEventType eventType, ulong clientId, stri
849849
case NetEventType.Data:
850850
if (LogHelper.CurrentLogLevel <= LogLevel.Developer) LogHelper.LogInfo($"Incoming Data From {clientId} : {payload.Count} bytes");
851851

852-
HandleIncomingData(clientId, channelName, payload, receiveTime);
852+
HandleIncomingData(clientId, channelName, payload, receiveTime, true);
853853
break;
854854
case NetEventType.Disconnect:
855855
NetworkProfiler.StartEvent(TickType.Receive, 0, "NONE", "TRANSPORT_DISCONNECT");
@@ -871,7 +871,7 @@ private void HandleRawTransportPoll(NetEventType eventType, ulong clientId, stri
871871
}
872872
}
873873

874-
internal void HandleIncomingData(ulong clientId, string channelName, ArraySegment<byte> data, float receiveTime)
874+
internal void HandleIncomingData(ulong clientId, string channelName, ArraySegment<byte> data, float receiveTime, bool allowBuffer)
875875
{
876876
if (LogHelper.CurrentLogLevel <= LogLevel.Developer) LogHelper.LogInfo("Unwrapping Data Header");
877877

@@ -910,6 +910,13 @@ internal void HandleIncomingData(ulong clientId, string channelName, ArraySegmen
910910

911911
void bufferCallback(ulong networkId)
912912
{
913+
if (!allowBuffer)
914+
{
915+
// This is to prevent recursive buffering
916+
if (LogHelper.CurrentLogLevel <= LogLevel.Error) LogHelper.LogError("A message of type " + MLAPIConstants.MESSAGE_NAMES[messageType] + " was recursivley buffered. It has been dropped.");
917+
return;
918+
}
919+
913920
if (!NetworkConfig.EnableMessageBuffering)
914921
{
915922
throw new InvalidOperationException("Cannot buffer with buffering disabled.");
@@ -927,12 +934,10 @@ void bufferCallback(ulong networkId)
927934
switch (messageType)
928935
{
929936
case MLAPIConstants.MLAPI_CONNECTION_REQUEST:
930-
if (IsServer)
931-
InternalMessageHandler.HandleConnectionRequest(clientId, messageStream);
937+
if (IsServer) InternalMessageHandler.HandleConnectionRequest(clientId, messageStream);
932938
break;
933939
case MLAPIConstants.MLAPI_CONNECTION_APPROVED:
934-
if (IsClient)
935-
InternalMessageHandler.HandleConnectionApproved(clientId, messageStream, receiveTime);
940+
if (IsClient) InternalMessageHandler.HandleConnectionApproved(clientId, messageStream, receiveTime);
936941
break;
937942
case MLAPIConstants.MLAPI_ADD_OBJECT:
938943
if (IsClient) InternalMessageHandler.HandleAddObject(clientId, messageStream);

MLAPI/Messaging/InternalMessageHandler.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -379,7 +379,7 @@ internal static void HandleAddObject(ulong clientId, Stream stream)
379379
{
380380
BufferManager.BufferedMessage message = bufferQueue.Dequeue();
381381

382-
NetworkingManager.Singleton.HandleIncomingData(message.sender, message.channelName, new ArraySegment<byte>(message.payload.GetBuffer(), (int)message.payload.Position, (int)message.payload.Length), message.receiveTime);
382+
NetworkingManager.Singleton.HandleIncomingData(message.sender, message.channelName, new ArraySegment<byte>(message.payload.GetBuffer(), (int)message.payload.Position, (int)message.payload.Length), message.receiveTime, false);
383383

384384
BufferManager.RecycleConsumedBufferedMessage(message);
385385
}

MLAPI/SceneManagement/NetworkSceneManager.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -356,7 +356,7 @@ private static void OnSceneUnloadClient(Guid switchSceneGuid, Stream objectStrea
356356
{
357357
BufferManager.BufferedMessage message = bufferQueue.Dequeue();
358358

359-
NetworkingManager.Singleton.HandleIncomingData(message.sender, message.channelName, new ArraySegment<byte>(message.payload.GetBuffer(), (int)message.payload.Position, (int)message.payload.Length), message.receiveTime);
359+
NetworkingManager.Singleton.HandleIncomingData(message.sender, message.channelName, new ArraySegment<byte>(message.payload.GetBuffer(), (int)message.payload.Position, (int)message.payload.Length), message.receiveTime, false);
360360

361361
BufferManager.RecycleConsumedBufferedMessage(message);
362362
}
@@ -401,7 +401,7 @@ private static void OnSceneUnloadClient(Guid switchSceneGuid, Stream objectStrea
401401
{
402402
BufferManager.BufferedMessage message = bufferQueue.Dequeue();
403403

404-
NetworkingManager.Singleton.HandleIncomingData(message.sender, message.channelName, new ArraySegment<byte>(message.payload.GetBuffer(), (int)message.payload.Position, (int)message.payload.Length), message.receiveTime);
404+
NetworkingManager.Singleton.HandleIncomingData(message.sender, message.channelName, new ArraySegment<byte>(message.payload.GetBuffer(), (int)message.payload.Position, (int)message.payload.Length), message.receiveTime, false);
405405

406406
BufferManager.RecycleConsumedBufferedMessage(message);
407407
}

0 commit comments

Comments
 (0)