From cb34313332ae9af2889bac926f66038dff908b51 Mon Sep 17 00:00:00 2001 From: kajkul Date: Wed, 17 Dec 2025 19:33:43 +0100 Subject: [PATCH] fix(voip-server-mumble): cleanup channel listeners when client is freed --- .../src/ChannelListener.cpp | 26 +++++++++++++++++++ .../voip-server-mumble/src/ChannelListener.h | 15 +++++++++++ .../voip-server-mumble/src/client.cpp | 1 + 3 files changed, 42 insertions(+) diff --git a/code/components/voip-server-mumble/src/ChannelListener.cpp b/code/components/voip-server-mumble/src/ChannelListener.cpp index 4c1b3a0f9e..3fd13e3da6 100644 --- a/code/components/voip-server-mumble/src/ChannelListener.cpp +++ b/code/components/voip-server-mumble/src/ChannelListener.cpp @@ -30,6 +30,22 @@ void ChannelListener::removeListenerImpl(unsigned int userSession, int channelID m_listenedChannels[channelID].erase(userSession); } +void ChannelListener::removeAllListenersForUserImpl(unsigned int userSession) +{ + std::unique_lock lock(m_listenerLock); + + auto it = m_listeningUsers.find(userSession); + if (it != m_listeningUsers.end()) + { + for (int channelID : it->second) + { + m_listenedChannels[channelID].erase(userSession); + } + + m_listeningUsers.erase(it); + } +} + bool ChannelListener::isListeningImpl(unsigned int userSession, int channelID) const { std::shared_lock lock(m_listenerLock); @@ -152,6 +168,16 @@ void ChannelListener::removeListener(const User* user, const Channel* channel) get().removeListenerImpl(user->sessionId, channel->id); } +void ChannelListener::removeAllListenersForUser(unsigned int userSession) +{ + get().removeAllListenersForUserImpl(userSession); +} + +void ChannelListener::removeAllListenersForUser(const User* user) +{ + get().removeAllListenersForUserImpl(user->sessionId); +} + bool ChannelListener::isListening(unsigned int userSession, int channelID) { return get().isListeningImpl(userSession, channelID); diff --git a/code/components/voip-server-mumble/src/ChannelListener.h b/code/components/voip-server-mumble/src/ChannelListener.h index 87185b423d..2d652c0ec9 100644 --- a/code/components/voip-server-mumble/src/ChannelListener.h +++ b/code/components/voip-server-mumble/src/ChannelListener.h @@ -49,6 +49,11 @@ class ChannelListener /// @param channelID The ID of the channel void removeListenerImpl(unsigned int userSession, int channelID); + /// Removes all listeners for the given user. + /// + /// @param userSession The session ID of the user + void removeAllListenersForUserImpl(unsigned int userSession); + /// @param userSession The session ID of the user /// @param channelID The ID of the channel /// @returns Whether the given user is listening to the given channel @@ -109,6 +114,16 @@ class ChannelListener /// @param channelID The ID of the channel static void removeListener(const User* user, const Channel* channel); + /// Removes all listeners for the given user. + /// + /// @param userSession The session ID of the user + static void removeAllListenersForUser(unsigned int userSession); + + /// Removes all listeners for the given user. + /// + /// @param user A pointer to the user object + static void removeAllListenersForUser(const User* user); + /// @param userSession The session ID of the user /// @param channelID The ID of the channel /// @returns Whether the given user is listening to the given channel diff --git a/code/components/voip-server-mumble/src/client.cpp b/code/components/voip-server-mumble/src/client.cpp index 1222f3f77b..e3171e9cf1 100644 --- a/code/components/voip-server-mumble/src/client.cpp +++ b/code/components/voip-server-mumble/src/client.cpp @@ -435,6 +435,7 @@ void Client_free(client_t *client) Client_codec_free(client); Voicetarget_free_all(client); Client_token_free(client); + ChannelListener::removeAllListenersForUser(client->sessionId); list_del(&client->node); /*if (client->ssl)