From 8846493eb4e3652c0f762565076390fc2bc131de Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Mon, 18 Apr 2016 16:36:45 -0400 Subject: [PATCH] Fix unsafe modification of the peer variable during shutdown --- src/ControlStream.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/ControlStream.c b/src/ControlStream.c index 5fd166c..f4f308f 100644 --- a/src/ControlStream.c +++ b/src/ControlStream.c @@ -291,6 +291,12 @@ static int sendMessageEnet(short ptype, short paylen, const void* payload) { int err; LC_ASSERT(ServerMajorVersion >= 5); + + // We may be trying to disconnect, so our peer could be gone. + // This check is safe because we're guaranteed to be holding enetMutex. + if (peer == NULL) { + return 0; + } packet = malloc(sizeof(*packet) + paylen); if (packet == NULL) { @@ -570,6 +576,7 @@ int stopControlStream(void) { if (peer != NULL) { PltLockMutex(&enetMutex); enet_peer_disconnect_now(peer, 0); + peer = NULL; PltUnlockMutex(&enetMutex); } @@ -586,7 +593,6 @@ int stopControlStream(void) { PltCloseThread(&lossStatsThread); PltCloseThread(&invalidateRefFramesThread); - peer = NULL; if (client != NULL) { enet_host_destroy(client); client = NULL;