From a6623d0e189cac154b032372697e8a9f5721d22e Mon Sep 17 00:00:00 2001 From: CPEGaebler <76662801+CPEGaebler@users.noreply.github.com> Date: Sat, 11 Mar 2023 17:12:50 -0500 Subject: [PATCH] Network bug: connections not 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" will evaluate to nullptr, whereas the matching shared_ptr in m_deqConnections has not been reset. No match will be found; 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. --- extensions/olcPGEX_Network.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/extensions/olcPGEX_Network.h b/extensions/olcPGEX_Network.h index 02fd6f0e..3fca0276 100644 --- a/extensions/olcPGEX_Network.h +++ b/extensions/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(); } }