From d2dc3212bf8c4321b2f76b38cc21456718859299 Mon Sep 17 00:00:00 2001 From: "M. Fatih MAR" Date: Wed, 18 Aug 2021 22:53:19 +0100 Subject: [PATCH 1/2] fix: eliminate bad use-after-free(destroy) pattern --- .../Runtime/Core/NetworkObject.cs | 12 ++++++++++++ .../Runtime/Spawning/NetworkSpawnManager.cs | 17 ++++++++--------- 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs b/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs index e22d2c4063..3dc87e55bb 100644 --- a/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs +++ b/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs @@ -380,8 +380,20 @@ public static void NetworkHide(List networkObjects, ulong clientI } } + private bool m_ApplicationQuitting = false; + + private void OnApplicationQuit() + { + m_ApplicationQuitting = true; + } + private void OnDestroy() { + if (m_ApplicationQuitting) + { + return; + } + if (NetworkManager != null && NetworkManager.IsListening && NetworkManager.IsServer == false && IsSpawned) { throw new NotServerException($"Destroy a spawned {nameof(NetworkObject)} on a non-host client is not valid. Call {nameof(Destroy)} or {nameof(Despawn)} on the server/host instead."); diff --git a/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs b/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs index 41dbb9b68b..2e2928f423 100644 --- a/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs +++ b/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs @@ -685,8 +685,15 @@ internal void OnDespawnObject(NetworkObject networkObject, bool destroyGameObjec } } - var gobj = networkObject.gameObject; + // for some reason, we can get down here and SpawnedObjects for this + // networkId will no longer be here, even as we check this at the start + // of the function + if (SpawnedObjects.Remove(networkObject.NetworkObjectId)) + { + SpawnedObjectsList.Remove(networkObject); + } + var gobj = networkObject.gameObject; if (destroyGameObject && gobj != null) { if (NetworkManager.PrefabHandler.ContainsHandler(networkObject)) @@ -698,14 +705,6 @@ internal void OnDespawnObject(NetworkObject networkObject, bool destroyGameObjec UnityEngine.Object.Destroy(gobj); } } - - // for some reason, we can get down here and SpawnedObjects for this - // networkId will no longer be here, even as we check this at the start - // of the function - if (SpawnedObjects.Remove(networkObject.NetworkObjectId)) - { - SpawnedObjectsList.Remove(networkObject); - } } } } From 00a0e051165b96d6e19c5aa530a1d72811d9350b Mon Sep 17 00:00:00 2001 From: "M. Fatih MAR" Date: Wed, 18 Aug 2021 22:58:56 +0100 Subject: [PATCH 2/2] remove obsolete comment --- .../Runtime/Spawning/NetworkSpawnManager.cs | 3 --- 1 file changed, 3 deletions(-) diff --git a/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs b/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs index 2e2928f423..500a9d8c17 100644 --- a/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs +++ b/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs @@ -685,9 +685,6 @@ internal void OnDespawnObject(NetworkObject networkObject, bool destroyGameObjec } } - // for some reason, we can get down here and SpawnedObjects for this - // networkId will no longer be here, even as we check this at the start - // of the function if (SpawnedObjects.Remove(networkObject.NetworkObjectId)) { SpawnedObjectsList.Remove(networkObject);