Skip to content

NetworkBehaviour length safety checks can break synchronization #3335

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
Mercury-Leo opened this issue Mar 4, 2025 · 4 comments
Open

NetworkBehaviour length safety checks can break synchronization #3335

Mercury-Leo opened this issue Mar 4, 2025 · 4 comments
Assignees
Labels
priority:high This issue has high priority and we are focusing to resolve it stat:imported Status - Issue is tracked internally at Unity type:bug Bug Report

Comments

@Mercury-Leo
Copy link

Description

If you have the flag `EnsureNetworkVariableLengthSafety' on, this can cause synchronization to break.
I have some very large network behaviours and this caused it to not work as intended when a new client joins and have to sync the full network object, there were no error that could indicate to this matter.

Reproduce Steps

  1. Create a network variable that sends a message larger than a ushort bytes
  2. Spawn that object with more than one client connected

Actual Outcome

Synchronization is broken.

Expected Outcome

Object is synced correctly between clients.

Environment

  • OS: Windows 11 23H2
  • Unity Version: 6000.0.32f1
  • Netcode Version: 2.2.0

Additional Context

This is a mismatch between definitions.
In NetworkMessageManager.cs line 115

public int FragmentedMessageMaxSize = int.MaxValue;

Max message size is defined as MaxInt.

In NetworkBehaviour.cs line 1262

var varSize = (ushort)0;

varSize gets cast to ushort.

And if you have ensureLengthSafety on:

if (NetworkVariableFields[j].CanClientRead(clientId)) { if (ensureLengthSafety) { reader.ReadValueSafe(out varSize); if (varSize == 0) { Debug.LogError($"[{name}][NetworkObjectId: {NetworkObjectId}][NetworkBehaviourId: {NetworkBehaviourId}][{NetworkVariableFields[j].Name}] Expected non-zero size readable NetworkVariable! (Skipping)"); continue; } readStartPos = reader.Position; } }

If the size is larger than a ushort (as it can get up to Max Int), it will skip this and break.

@Mercury-Leo Mercury-Leo added stat:awaiting-triage Status - Awaiting triage from the Netcode team. type:bug Bug Report labels Mar 4, 2025
@EmandM
Copy link
Collaborator

EmandM commented Mar 4, 2025

Thanks for reporting this. Do you have logs of the error when things are breaking?

@EmandM EmandM added stat:awaiting-response Awaiting response from author. This label should be added manually. stat:import Status - Issue is going to be saved internally and removed stat:awaiting-triage Status - Awaiting triage from the Netcode team. labels Mar 4, 2025
@Mercury-Leo
Copy link
Author

These are the logs:

[<color=yellow>Warning</color>] : [Netcode] [NetworkFeatureCollection][NetworkObjectId: 0][NetworkBehaviourId: 0][_networkFeatureBacking] NetworkVariable data read too big. 65536 bytes.
Unity.Netcode.NetworkBehaviour:SetNetworkVariableData (Unity.Netcode.FastBufferReader,ulong) (at C:/DEV/LogicClient/src/OverSight_Unity/Library/PackageCache/com.unity.netcode.gameobjects/Runtime/Core/NetworkBehaviour.cs:1303)
Unity.Netcode.NetworkObject:SetNetworkVariableData (Unity.Netcode.FastBufferReader,ulong) (at C:/DEV/LogicClient/src/OverSight_Unity/Library/PackageCache/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs:2581)
Unity.Netcode.NetworkObject:SynchronizeNetworkBehaviours<Unity.Netcode.BufferSerializerReader> (Unity.Netcode.BufferSerializer`1<Unity.Netcode.BufferSerializerReader>&,ulong) (at C:/DEV/LogicClient/src/OverSight_Unity/Library/PackageCache/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs:2930)
Unity.Netcode.NetworkObject:AddSceneObject (Unity.Netcode.NetworkObject/SceneObject&,Unity.Netcode.FastBufferReader,Unity.Netcode.NetworkManager,bool) (at C:/DEV/LogicClient/src/OverSight_Unity/Library/PackageCache/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs:3101)
Unity.Netcode.SceneEventData:SynchronizeSceneNetworkObjects (Unity.Netcode.NetworkManager) (at C:/DEV/LogicClient/src/OverSight_Unity/Library/PackageCache/com.unity.netcode.gameobjects/Runtime/SceneManagement/SceneEventData.cs:1119)
Unity.Netcode.NetworkSceneManager:HandleClientSceneEvent (uint) (at C:/DEV/LogicClient/src/OverSight_Unity/Library/PackageCache/com.unity.netcode.gameobjects/Runtime/SceneManagement/NetworkSceneManager.cs:2358)
Unity.Netcode.NetworkSceneManager:ClientLoadedSynchronization (uint) (at C:/DEV/LogicClient/src/OverSight_Unity/Library/PackageCache/com.unity.netcode.gameobjects/Runtime/SceneManagement/NetworkSceneManager.cs:2253)

[<color=yellow>Warning</color>] : [Netcode] [NetworkFeatureCollection][NetworkObjectId: 0][NetworkBehaviourId: 0][_networkFeatureVisibility] NetworkVariable data read too small. 25537 bytes.
Unity.Netcode.NetworkBehaviour:SetNetworkVariableData (Unity.Netcode.FastBufferReader,ulong) (at C:/DEV/LogicClient/src/OverSight_Unity/Library/PackageCache/com.unity.netcode.gameobjects/Runtime/Core/NetworkBehaviour.cs:1312)
Unity.Netcode.NetworkObject:SetNetworkVariableData (Unity.Netcode.FastBufferReader,ulong) (at C:/DEV/LogicClient/src/OverSight_Unity/Library/PackageCache/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs:2581)
Unity.Netcode.NetworkObject:SynchronizeNetworkBehaviours<Unity.Netcode.BufferSerializerReader> (Unity.Netcode.BufferSerializer`1<Unity.Netcode.BufferSerializerReader>&,ulong) (at C:/DEV/LogicClient/src/OverSight_Unity/Library/PackageCache/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs:2930)
Unity.Netcode.NetworkObject:AddSceneObject (Unity.Netcode.NetworkObject/SceneObject&,Unity.Netcode.FastBufferReader,Unity.Netcode.NetworkManager,bool) (at C:/DEV/LogicClient/src/OverSight_Unity/Library/PackageCache/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs:3101)
Unity.Netcode.SceneEventData:SynchronizeSceneNetworkObjects (Unity.Netcode.NetworkManager) (at C:/DEV/LogicClient/src/OverSight_Unity/Library/PackageCache/com.unity.netcode.gameobjects/Runtime/SceneManagement/SceneEventData.cs:1119)
Unity.Netcode.NetworkSceneManager:HandleClientSceneEvent (uint) (at C:/DEV/LogicClient/src/OverSight_Unity/Library/PackageCache/com.unity.netcode.gameobjects/Runtime/SceneManagement/NetworkSceneManager.cs:2358)
Unity.Netcode.NetworkSceneManager:ClientLoadedSynchronization (uint) (at C:/DEV/LogicClient/src/OverSight_Unity/Library/PackageCache/com.unity.netcode.gameobjects/Runtime/SceneManagement/NetworkSceneManager.cs:2253)

[<color=red>Error</color>] : [NetworkFeatureCollection][NetworkObjectId: 0][NetworkBehaviourId: 0][_collectionName] Expected non-zero size readable NetworkVariable! (Skipping)
Unity.Netcode.NetworkBehaviour:SetNetworkVariableData (Unity.Netcode.FastBufferReader,ulong) (at C:/DEV/LogicClient/src/OverSight_Unity/Library/PackageCache/com.unity.netcode.gameobjects/Runtime/Core/NetworkBehaviour.cs:1273)
Unity.Netcode.NetworkObject:SetNetworkVariableData (Unity.Netcode.FastBufferReader,ulong) (at C:/DEV/LogicClient/src/OverSight_Unity/Library/PackageCache/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs:2581)
Unity.Netcode.NetworkObject:SynchronizeNetworkBehaviours<Unity.Netcode.BufferSerializerReader> (Unity.Netcode.BufferSerializer`1<Unity.Netcode.BufferSerializerReader>&,ulong) (at C:/DEV/LogicClient/src/OverSight_Unity/Library/PackageCache/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs:2930)
Unity.Netcode.NetworkObject:AddSceneObject (Unity.Netcode.NetworkObject/SceneObject&,Unity.Netcode.FastBufferReader,Unity.Netcode.NetworkManager,bool) (at C:/DEV/LogicClient/src/OverSight_Unity/Library/PackageCache/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs:3101)
Unity.Netcode.SceneEventData:SynchronizeSceneNetworkObjects (Unity.Netcode.NetworkManager) (at C:/DEV/LogicClient/src/OverSight_Unity/Library/PackageCache/com.unity.netcode.gameobjects/Runtime/SceneManagement/SceneEventData.cs:1119)
Unity.Netcode.NetworkSceneManager:HandleClientSceneEvent (uint) (at C:/DEV/LogicClient/src/OverSight_Unity/Library/PackageCache/com.unity.netcode.gameobjects/Runtime/SceneManagement/NetworkSceneManager.cs:2358)
Unity.Netcode.NetworkSceneManager:ClientLoadedSynchronization (uint) (at C:/DEV/LogicClient/src/OverSight_Unity/Library/PackageCache/com.unity.netcode.gameobjects/Runtime/SceneManagement/NetworkSceneManager.cs:2253)

[<color=yellow>Warning</color>] : [Size mismatch] Expected: 29156 Currently At: 54538!
Unity.Netcode.NetworkObject:SynchronizeNetworkBehaviours<Unity.Netcode.BufferSerializerReader> (Unity.Netcode.BufferSerializer`1<Unity.Netcode.BufferSerializerReader>&,ulong) (at C:/DEV/LogicClient/src/OverSight_Unity/Library/PackageCache/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs:2953)
Unity.Netcode.NetworkObject:AddSceneObject (Unity.Netcode.NetworkObject/SceneObject&,Unity.Netcode.FastBufferReader,Unity.Netcode.NetworkManager,bool) (at C:/DEV/LogicClient/src/OverSight_Unity/Library/PackageCache/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs:3101)
Unity.Netcode.SceneEventData:SynchronizeSceneNetworkObjects (Unity.Netcode.NetworkManager) (at C:/DEV/LogicClient/src/OverSight_Unity/Library/PackageCache/com.unity.netcode.gameobjects/Runtime/SceneManagement/SceneEventData.cs:1119)
Unity.Netcode.NetworkSceneManager:HandleClientSceneEvent (uint) (at C:/DEV/LogicClient/src/OverSight_Unity/Library/PackageCache/com.unity.netcode.gameobjects/Runtime/SceneManagement/NetworkSceneManager.cs:2358)
Unity.Netcode.NetworkSceneManager:ClientLoadedSynchronization (uint) (at C:/DEV/LogicClient/src/OverSight_Unity/Library/PackageCache/com.unity.netcode.gameobjects/Runtime/SceneManagement/NetworkSceneManager.cs:2253)

[<color=red>Error</color>] : [Netcode] Failed to create object locally. [globalObjectIdHash=571724729]. NetworkPrefab could not be found. Is the prefab registered with NetworkManager?
Unity.Netcode.NetworkSpawnManager:GetNetworkObjectToSpawn (uint,ulong,System.Nullable`1<UnityEngine.Vector3>,System.Nullable`1<UnityEngine.Quaternion>,bool) (at C:/DEV/LogicClient/src/OverSight_Unity/Library/PackageCache/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs:822)
Unity.Netcode.NetworkSpawnManager:CreateLocalNetworkObject (Unity.Netcode.NetworkObject/SceneObject) (at C:/DEV/LogicClient/src/OverSight_Unity/Library/PackageCache/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs:880)
Unity.Netcode.NetworkObject:AddSceneObject (Unity.Netcode.NetworkObject/SceneObject&,Unity.Netcode.FastBufferReader,Unity.Netcode.NetworkManager,bool) (at C:/DEV/LogicClient/src/OverSight_Unity/Library/PackageCache/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs:3067)
Unity.Netcode.SceneEventData:SynchronizeSceneNetworkObjects (Unity.Netcode.NetworkManager) (at C:/DEV/LogicClient/src/OverSight_Unity/Library/PackageCache/com.unity.netcode.gameobjects/Runtime/SceneManagement/SceneEventData.cs:1119)
Unity.Netcode.NetworkSceneManager:HandleClientSceneEvent (uint) (at C:/DEV/LogicClient/src/OverSight_Unity/Library/PackageCache/com.unity.netcode.gameobjects/Runtime/SceneManagement/NetworkSceneManager.cs:2358)
Unity.Netcode.NetworkSceneManager:ClientLoadedSynchronization (uint) (at C:/DEV/LogicClient/src/OverSight_Unity/Library/PackageCache/com.unity.netcode.gameobjects/Runtime/SceneManagement/NetworkSceneManager.cs:2253)

[<color=red>Error</color>] : [Netcode] Failed to spawn NetworkObject for Hash 571724729.
Unity.Netcode.NetworkObject:AddSceneObject (Unity.Netcode.NetworkObject/SceneObject&,Unity.Netcode.FastBufferReader,Unity.Netcode.NetworkManager,bool) (at C:/DEV/LogicClient/src/OverSight_Unity/Library/PackageCache/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs:3074)
Unity.Netcode.SceneEventData:SynchronizeSceneNetworkObjects (Unity.Netcode.NetworkManager) (at C:/DEV/LogicClient/src/OverSight_Unity/Library/PackageCache/com.unity.netcode.gameobjects/Runtime/SceneManagement/SceneEventData.cs:1119)
Unity.Netcode.NetworkSceneManager:HandleClientSceneEvent (uint) (at C:/DEV/LogicClient/src/OverSight_Unity/Library/PackageCache/com.unity.netcode.gameobjects/Runtime/SceneManagement/NetworkSceneManager.cs:2358)
Unity.Netcode.NetworkSceneManager:ClientLoadedSynchronization (uint) (at C:/DEV/LogicClient/src/OverSight_Unity/Library/PackageCache/com.unity.netcode.gameobjects/Runtime/SceneManagement/NetworkSceneManager.cs:2253)

[<color=yellow>Warning</color>] : [SceneEventData- Scene Handle Mismatch] serverSceneHandle (0) could not be found in ServerSceneHandleToClientSceneHandle. Using the currently active scene.
Unity.Netcode.NetworkSceneManager:SetTheSceneBeingSynchronized (int) (at C:/DEV/LogicClient/src/OverSight_Unity/Library/PackageCache/com.unity.netcode.gameobjects/Runtime/SceneManagement/NetworkSceneManager.cs:1017)
Unity.Netcode.SceneEventData:SynchronizeSceneNetworkObjects (Unity.Netcode.NetworkManager) (at C:/DEV/LogicClient/src/OverSight_Unity/Library/PackageCache/com.unity.netcode.gameobjects/Runtime/SceneManagement/SceneEventData.cs:1117)
Unity.Netcode.NetworkSceneManager:HandleClientSceneEvent (uint) (at C:/DEV/LogicClient/src/OverSight_Unity/Library/PackageCache/com.unity.netcode.gameobjects/Runtime/SceneManagement/NetworkSceneManager.cs:2358)
Unity.Netcode.NetworkSceneManager:ClientLoadedSynchronization (uint) (at C:/DEV/LogicClient/src/OverSight_Unity/Library/PackageCache/com.unity.netcode.gameobjects/Runtime/SceneManagement/NetworkSceneManager.cs:2253)

[<color=red>Error</color>] : [Netcode] NetworkPrefab hash was not found! In-Scene placed NetworkObject soft synchronization failure for Hash: 410651387!
Unity.Netcode.NetworkSpawnManager:CreateLocalNetworkObject (Unity.Netcode.NetworkObject/SceneObject) (at C:/DEV/LogicClient/src/OverSight_Unity/Library/PackageCache/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs:889)
Unity.Netcode.NetworkObject:AddSceneObject (Unity.Netcode.NetworkObject/SceneObject&,Unity.Netcode.FastBufferReader,Unity.Netcode.NetworkManager,bool) (at C:/DEV/LogicClient/src/OverSight_Unity/Library/PackageCache/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs:3067)

[<color=red>Error</color>] : [Netcode] Failed to spawn NetworkObject for Hash 410651387.
Unity.Netcode.NetworkObject:AddSceneObject (Unity.Netcode.NetworkObject/SceneObject&,Unity.Netcode.FastBufferReader,Unity.Netcode.NetworkManager,bool) (at C:/DEV/LogicClient/src/OverSight_Unity/Library/PackageCache/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs:3074)
Unity.Netcode.SceneEventData:SynchronizeSceneNetworkObjects (Unity.Netcode.NetworkManager) (at C:/DEV/LogicClient/src/OverSight_Unity/Library/PackageCache/com.unity.netcode.gameobjects/Runtime/SceneManagement/SceneEventData.cs:1119)
Unity.Netcode.NetworkSceneManager:HandleClientSceneEvent (uint) (at C:/DEV/LogicClient/src/OverSight_Unity/Library/PackageCache/com.unity.netcode.gameobjects/Runtime/SceneManagement/NetworkSceneManager.cs:2358)
Unity.Netcode.NetworkSceneManager:ClientLoadedSynchronization (uint) (at C:/DEV/LogicClient/src/OverSight_Unity/Library/PackageCache/com.unity.netcode.gameobjects/Runtime/SceneManagement/NetworkSceneManager.cs:2253)
Unity.Netcode.SceneEventProgress:<SetAsyncOperation>b__37_0 (UnityEngine.AsyncOperation) (at C:/DEV/LogicClient/src/OverSight_Unity/Library/PackageCache/com.unity.netcode.gameobjects/Runtime/SceneManagement/SceneEventProgress.cs:272)
UnityEngine.AsyncOperation:InvokeCompletionEvent ()

OverflowException: Reading past the end of the buffer
Unity.Netcode.FastBufferReader.ReadBytesSafe (System.Byte* value, System.Int32 size, System.Int32 offset) (at C:/DEV/LogicClient/src/OverSight_Unity/Library/PackageCache/com.unity.netcode.gameobjects/Runtime/Serialization/FastBufferReader.cs:747)
Unity.Netcode.FastBufferReader.ReadUnmanagedSafe[T] (T& value) (at C:/DEV/LogicClient/src/OverSight_Unity/Library/PackageCache/com.unity.netcode.gameobjects/Runtime/Serialization/FastBufferReader.cs:801)
Unity.Netcode.FastBufferReader.ReadValueSafe[T] (T& value, Unity.Netcode.FastBufferWriter+ForPrimitives unused) (at C:/DEV/LogicClient/src/OverSight_Unity/Library/PackageCache/com.unity.netcode.gameobjects/Runtime/Serialization/FastBufferReader.cs:1170)
Unity.Netcode.NetworkObject+SceneObject.Deserialize (Unity.Netcode.FastBufferReader reader) (at C:/DEV/LogicClient/src/OverSight_Unity/Library/PackageCache/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs:2811)

NullReferenceException: Object reference not set to an instance of an object
Unity.Netcode.SceneEventData.SynchronizeSceneNetworkObjects (Unity.Netcode.NetworkManager networkManager) (at C:/DEV/LogicClient/src/OverSight_Unity/Library/PackageCache/com.unity.netcode.gameobjects/Runtime/SceneManagement/SceneEventData.cs:1157)
Unity.Netcode.NetworkSceneManager.HandleClientSceneEvent (System.UInt32 sceneEventId) (at C:/DEV/LogicClient/src/OverSight_Unity/Library/PackageCache/com.unity.netcode.gameobjects/Runtime/SceneManagement/NetworkSceneManager.cs:2358)
Unity.Netcode.NetworkSceneManager.ClientLoadedSynchronization (System.UInt32 sceneEventId) (at C:/DEV/LogicClient/src/OverSight_Unity/Library/PackageCache/com.unity.netcode.gameobjects/Runtime/SceneManagement/NetworkSceneManager.cs:2253)

The NetworkList has around 80kb of data in it that needs syncing. When 'ReadField' is called in the network variable, it writes the whole 80kb of data into the stream writer.

However, the reader can only read ushort (64kb) max data per variable message, leading to this issue.

Specifically, the write command that tells the stream reader places the amount of bytes in the stream as the first value. However, this is a ushort. As we have more data than a ushort, it cannot write the full size of the incoming stream.

I see two simple solutions to this problem.
Increase the size of the network message variable length header from ushort to int (doubling its size) or implementing some way of splitting large network delta messages into two parts.

@EmandM EmandM removed the stat:awaiting-response Awaiting response from author. This label should be added manually. label Mar 6, 2025
@EmandM
Copy link
Collaborator

EmandM commented Mar 6, 2025

Thank you so much for all the information! This is definitely something that we need to fix

@EmandM EmandM self-assigned this Mar 6, 2025
@NoelStephensUnity NoelStephensUnity added the priority:high This issue has high priority and we are focusing to resolve it label Mar 8, 2025
@NoelStephensUnity
Copy link
Collaborator

@Mercury-Leo
This is something we have marked as a high priority and will try to get a fix for this in the next update.
Since everything is sent reliably, I would just disable this check for the time being.

@michalChrobot michalChrobot added stat:imported Status - Issue is tracked internally at Unity and removed stat:import Status - Issue is going to be saved internally labels Mar 10, 2025
@michalChrobot michalChrobot added the stat:reply-needed Awaiting reply from Unity account label Apr 1, 2025
@EmandM EmandM removed the stat:reply-needed Awaiting reply from Unity account label Apr 7, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
priority:high This issue has high priority and we are focusing to resolve it stat:imported Status - Issue is tracked internally at Unity type:bug Bug Report
Projects
None yet
Development

No branches or pull requests

4 participants