From 658bc9fcc896b6987cc7401992c3cb703fbf048e Mon Sep 17 00:00:00 2001 From: sfan5 Date: Wed, 13 Mar 2024 21:24:35 +0100 Subject: [PATCH] Fix infinite loop in Server::stopAttachedSounds --- src/server.cpp | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/server.cpp b/src/server.cpp index 19d92316c..8cf3d37ee 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -2288,22 +2288,25 @@ void Server::stopAttachedSounds(session_t peer_id, u16 object_id) assert(peer_id != PEER_ID_INEXISTENT); assert(object_id); - for (auto it = m_playing_sounds.begin(); it != m_playing_sounds.end();) { - ServerPlayingSound &sound = it->second; - + auto cb = [&] (const s32 id, ServerPlayingSound &sound) -> bool { if (sound.object != object_id) - continue; + return false; auto clients_it = sound.clients.find(peer_id); if (clients_it == sound.clients.end()) - continue; + return false; NetworkPacket pkt(TOCLIENT_STOP_SOUND, 4); - pkt << it->first; + pkt << id; Send(peer_id, &pkt); sound.clients.erase(clients_it); - if (sound.clients.empty()) + // delete if client list empty + return sound.clients.empty(); + }; + + for (auto it = m_playing_sounds.begin(); it != m_playing_sounds.end(); ) { + if (cb(it->first, it->second)) it = m_playing_sounds.erase(it); else ++it;