Skip to content

Commit 64ed674

Browse files
fix: handle null or empty named message registration [MTT-7771] (#2807)
* fix Fixes issue where registering or unregistering named message that is null or empty does not throw an exception. Fixes issue where it was possible that NetworkTransform could try to unregister a named message before it had been assigned a value. * update Actually decided to make both cases log an error and raised the minimum loglevel. * test Adding a test to verify that trying to register or unregister a null or empty named message will not throw an exception. * style removing whitespace * update Adding change log entries
1 parent 073f861 commit 64ed674

File tree

4 files changed

+50
-1
lines changed

4 files changed

+50
-1
lines changed

com.unity.netcode.gameobjects/CHANGELOG.md

+13
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,19 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
66

77
Additional documentation and release notes are available at [Multiplayer Documentation](https://docs-multiplayer.unity3d.com).
88

9+
## [Unreleased]
10+
11+
### Added
12+
13+
### Fixed
14+
15+
- Fixed issue where NetworkTransform could potentially attempt to "unregister" a named message prior to it being registered. (#2807)
16+
17+
### Changed
18+
19+
- Changed `CustomMessageManager` so it no longer attempts to register or "unregister" a null or empty string and will log an error if this condition occurs. (#2807)
20+
21+
922
## [1.8.0] - 2023-12-12
1023

1124
### Added

com.unity.netcode.gameobjects/Components/NetworkTransform.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -2763,7 +2763,7 @@ public override void OnNetworkSpawn()
27632763
public override void OnNetworkDespawn()
27642764
{
27652765
// During destroy, use NetworkBehaviour.NetworkManager as opposed to m_CachedNetworkManager
2766-
if (!NetworkManager.ShutdownInProgress && NetworkManager.CustomMessagingManager != null)
2766+
if (!NetworkManager.ShutdownInProgress && NetworkManager.CustomMessagingManager != null && !string.IsNullOrEmpty(m_MessageName))
27672767
{
27682768
NetworkManager.CustomMessagingManager.UnregisterNamedMessageHandler(m_MessageName);
27692769
}

com.unity.netcode.gameobjects/Runtime/Messaging/CustomMessageManager.cs

+18
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System;
22
using System.Collections.Generic;
33
using Unity.Collections;
4+
using UnityEngine;
45

56
namespace Unity.Netcode
67
{
@@ -199,6 +200,14 @@ internal void InvokeNamedMessage(ulong hash, ulong sender, FastBufferReader read
199200
/// <param name="callback">The callback to run when a named message is received.</param>
200201
public void RegisterNamedMessageHandler(string name, HandleNamedMessageDelegate callback)
201202
{
203+
if (string.IsNullOrEmpty(name))
204+
{
205+
if (m_NetworkManager.LogLevel <= LogLevel.Error)
206+
{
207+
Debug.LogError($"[{nameof(CustomMessagingManager.RegisterNamedMessageHandler)}] Cannot register a named message of type null or empty!");
208+
}
209+
return;
210+
}
202211
var hash32 = XXHash.Hash32(name);
203212
var hash64 = XXHash.Hash64(name);
204213

@@ -215,6 +224,15 @@ public void RegisterNamedMessageHandler(string name, HandleNamedMessageDelegate
215224
/// <param name="name">The name of the message.</param>
216225
public void UnregisterNamedMessageHandler(string name)
217226
{
227+
if (string.IsNullOrEmpty(name))
228+
{
229+
if (m_NetworkManager.LogLevel <= LogLevel.Error)
230+
{
231+
Debug.LogError($"[{nameof(CustomMessagingManager.UnregisterNamedMessageHandler)}] Cannot unregister a named message of type null or empty!");
232+
}
233+
return;
234+
}
235+
218236
var hash32 = XXHash.Hash32(name);
219237
var hash64 = XXHash.Hash64(name);
220238

com.unity.netcode.gameobjects/Tests/Runtime/Messaging/NamedMessageTests.cs

+18
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,24 @@ public void NamedMessageIsReceivedOnHostWithContent()
8686
Assert.AreEqual(m_ServerNetworkManager.LocalClientId, receivedMessageSender);
8787
}
8888

89+
private void MockNamedMessageCallback(ulong sender, FastBufferReader reader)
90+
{
91+
92+
}
93+
94+
[Test]
95+
public void NullOrEmptyNamedMessageDoesNotThrowException()
96+
{
97+
LogAssert.Expect(UnityEngine.LogType.Error, $"[{nameof(CustomMessagingManager.RegisterNamedMessageHandler)}] Cannot register a named message of type null or empty!");
98+
m_ServerNetworkManager.CustomMessagingManager.RegisterNamedMessageHandler(string.Empty, MockNamedMessageCallback);
99+
LogAssert.Expect(UnityEngine.LogType.Error, $"[{nameof(CustomMessagingManager.RegisterNamedMessageHandler)}] Cannot register a named message of type null or empty!");
100+
m_ServerNetworkManager.CustomMessagingManager.RegisterNamedMessageHandler(null, MockNamedMessageCallback);
101+
LogAssert.Expect(UnityEngine.LogType.Error, $"[{nameof(CustomMessagingManager.UnregisterNamedMessageHandler)}] Cannot unregister a named message of type null or empty!");
102+
m_ServerNetworkManager.CustomMessagingManager.UnregisterNamedMessageHandler(string.Empty);
103+
LogAssert.Expect(UnityEngine.LogType.Error, $"[{nameof(CustomMessagingManager.UnregisterNamedMessageHandler)}] Cannot unregister a named message of type null or empty!");
104+
m_ServerNetworkManager.CustomMessagingManager.UnregisterNamedMessageHandler(null);
105+
}
106+
89107
[UnityTest]
90108
public IEnumerator NamedMessageIsReceivedOnMultipleClientsWithContent()
91109
{

0 commit comments

Comments
 (0)