diff --git a/com.unity.netcode.gameobjects/CHANGELOG.md b/com.unity.netcode.gameobjects/CHANGELOG.md
index 74718c95b9..480152dc66 100644
--- a/com.unity.netcode.gameobjects/CHANGELOG.md
+++ b/com.unity.netcode.gameobjects/CHANGELOG.md
@@ -22,6 +22,7 @@ Additional documentation and release notes are available at [Multiplayer Documen
### Fixed
+- Fixed an issue in `UnityTransport` where the transport would accept sends on invalid connections, leading to a useless memory allocation and confusing error message. (#3382)
- Fixed issue where the time delta that interpolators used would not be properly updated during multiple fixed update invocations within the same player loop frame. (#3355)
- Fixed issue when using a distributed authority network topology and many clients attempt to connect simultaneously the session owner could max-out the maximum in-flight reliable messages allowed, start dropping packets, and some of the connecting clients would fail to fully synchronize. (#3350)
- Fixed issue when using a distributed authority network topology and scene management was disabled clients would not be able to spawn any new network prefab instances until synchronization was complete. (#3350)
diff --git a/com.unity.netcode.gameobjects/Runtime/Transports/UTP/UnityTransport.cs b/com.unity.netcode.gameobjects/Runtime/Transports/UTP/UnityTransport.cs
index 3bd74f7aab..da3b797aea 100644
--- a/com.unity.netcode.gameobjects/Runtime/Transports/UTP/UnityTransport.cs
+++ b/com.unity.netcode.gameobjects/Runtime/Transports/UTP/UnityTransport.cs
@@ -1347,8 +1347,13 @@ public override NetcodeNetworkEvent PollEvent(out ulong clientId, out ArraySegme
/// The delivery type (QoS) to send data with
public override void Send(ulong clientId, ArraySegment payload, NetworkDelivery networkDelivery)
{
- var pipeline = SelectSendPipeline(networkDelivery);
+ var connection = ParseClientId(clientId);
+ if (!m_Driver.IsCreated || m_Driver.GetConnectionState(connection) != NetworkConnection.State.Connected)
+ {
+ return;
+ }
+ var pipeline = SelectSendPipeline(networkDelivery);
if (pipeline != m_ReliableSequencedPipeline && payload.Count > m_MaxPayloadSize)
{
Debug.LogError($"Unreliable payload of size {payload.Count} larger than configured 'Max Payload Size' ({m_MaxPayloadSize}).");
diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/Transports/UnityTransportTests.cs b/com.unity.netcode.gameobjects/Tests/Runtime/Transports/UnityTransportTests.cs
index 4cd33fcc9b..ba68c4147f 100644
--- a/com.unity.netcode.gameobjects/Tests/Runtime/Transports/UnityTransportTests.cs
+++ b/com.unity.netcode.gameobjects/Tests/Runtime/Transports/UnityTransportTests.cs
@@ -483,5 +483,22 @@ public IEnumerator DoesNotActAfterShutdown([Values] AfterShutdownAction afterShu
yield return EnsureNoNetworkEvent(m_Client1Events);
}
}
+
+ [UnityTest]
+ public IEnumerator DoesNotAttemptToSendOnInvalidConnections()
+ {
+ InitializeTransport(out m_Server, out m_ServerEvents);
+ InitializeTransport(out m_Client1, out m_Client1Events);
+
+ m_Server.StartServer();
+ m_Client1.StartClient();
+
+ yield return WaitForNetworkEvent(NetworkEvent.Connect, m_Client1Events);
+
+ var data = new ArraySegment(new byte[42]);
+ m_Server.Send(0, data, NetworkDelivery.Reliable);
+
+ yield return EnsureNoNetworkEvent(m_Client1Events);
+ }
}
}