From 4a9387fe831ef78fbd8dcb2db55742456f889fc8 Mon Sep 17 00:00:00 2001
From: Yukita Mayako <catgirl@goddess.moe>
Date: Sun, 13 Mar 2016 20:25:32 -0400
Subject: [PATCH] Trying to fix the crash-on-rehost and failing.

---
 src/d_enet.c | 29 ++++++++++++++++++++++++++---
 1 file changed, 26 insertions(+), 3 deletions(-)

diff --git a/src/d_enet.c b/src/d_enet.c
index 05a7d6edc6..7c37510f8a 100644
--- a/src/d_enet.c
+++ b/src/d_enet.c
@@ -740,6 +740,17 @@ void D_CloseConnection(void)
 
 			// good, go away.
 			case ENET_EVENT_TYPE_DISCONNECT:
+				if (e.peer->data)
+				{
+					PeerData *pdata = (PeerData *)e.peer->data;
+					if (playeringame[nodetoplayer[pdata->node]])
+						CL_RemovePlayer(nodetoplayer[pdata->node]);
+					nodetopeer[pdata->node] = NULL;
+					nodeingame[pdata->node] = false;
+					nodetoplayer[pdata->node] = -1;
+					Z_Free(pdata);
+					e.peer->data = NULL;
+				}
 				waiting--;
 				break;
 
@@ -752,6 +763,16 @@ void D_CloseConnection(void)
 				break;
 			}
 
+		// clean up the remaining nodes
+		for (i = 0; i < MAXNETNODES; i++)
+			if (nodetopeer[i])
+			{
+				enet_peer_reset(nodetopeer[i]);
+				nodetopeer[i] = NULL;
+				nodeingame[i] = false;
+				nodetoplayer[i] = -1;
+			}
+
 		// alright, we're finished.
 		enet_host_destroy(ServerHost);
 		ServerHost = NULL;
@@ -760,8 +781,6 @@ void D_CloseConnection(void)
 	if (ClientHost)
 	{
 		enet_peer_disconnect(nodetopeer[servernode], DISCONNECT_SHUTDOWN);
-		nodeingame[servernode] = false;
-		servernode = 0;
 
 		while (enet_host_service(ClientHost, &e, 3000) > 0)
 		{
@@ -783,13 +802,17 @@ void D_CloseConnection(void)
 			}
 		}
 
+		nodeingame[servernode] = false;
+		nodetopeer[servernode] = NULL;
+		servernode = 0;
+		server = true;
+
 		enet_host_destroy(ClientHost);
 		ClientHost = NULL;
 	}
 
 	netgame = false;
 	addedtogame = false;
-	servernode = 0;
 	net_nodecount = net_playercount = 0;
 }
 
-- 
GitLab