From 8f3386d18d7dc19ea3e92c47dcb1e1a4434015ed Mon Sep 17 00:00:00 2001 From: CPEGaebler <76662801+CPEGaebler@users.noreply.github.com> Date: Sat, 11 Mar 2023 17:01:56 -0500 Subject: [PATCH] Fixed a bug: connections weren't actually removed In server_interface::MessageClient(client): In the branch where "client" was found to be not connected (else on line 918): Line 926, "client.reset()," is before line 929, "erase client from m_deqConnections." This means "client" evaluates to nullptr, whereas the shared_ptr in m_deqConnections has not been reset. Nothing is removed from the container. Fix: I swapped the two lines. Found by / reproducable by: My implementation had a function "DisconnectClient" which copied the logic in this else block. Another function, "DisconnectAll," simply said: while (!m_deqConnections.empty()) DisconnectClient(m_deqConnections.front()); Infinite loop. --- .../BiggerProjects/Networking/Parts3&4/olcPGEX_Network.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/PixelGameEngine/BiggerProjects/Networking/Parts3&4/olcPGEX_Network.h b/PixelGameEngine/BiggerProjects/Networking/Parts3&4/olcPGEX_Network.h index 9499f7b..bf3deec 100644 --- a/PixelGameEngine/BiggerProjects/Networking/Parts3&4/olcPGEX_Network.h +++ b/PixelGameEngine/BiggerProjects/Networking/Parts3&4/olcPGEX_Network.h @@ -51,7 +51,7 @@ Author ~~~~~~ - David Barr, aka javidx9, ©OneLoneCoder 2019, 2020, 2021 + David Barr, aka javidx9, ©OneLoneCoder 2019, 2020, 2021 */ @@ -922,12 +922,12 @@ namespace olc // be tracking it somehow OnClientDisconnect(client); - // Off you go now, bye bye! - client.reset(); - // Then physically remove it from the container m_deqConnections.erase( std::remove(m_deqConnections.begin(), m_deqConnections.end(), client), m_deqConnections.end()); + + // Off you go now, bye bye! + client.reset(); } }