From 799c76ebecdef75db6c7c3bdbd16625997ddae91 Mon Sep 17 00:00:00 2001 From: dijunkun Date: Tue, 24 Feb 2026 11:17:35 +0800 Subject: [PATCH] [fix] fix iterator erase UB and prevent unintended map insertion in TransmissionManager --- src/transmission_manager.cpp | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/transmission_manager.cpp b/src/transmission_manager.cpp index 86df0d5..f820472 100644 --- a/src/transmission_manager.cpp +++ b/src/transmission_manager.cpp @@ -115,12 +115,15 @@ bool TransmissionManager::BindUserToWsHandle(const std::string& user_id, bool TransmissionManager::ReleaseGuestFromTransmission( const std::string& guest_id) { std::lock_guard lock(ws_hdl_alive_checker_mutex_); - for (auto& pair : transmission_guest_id_list_) { - auto& list = pair.second; + for (auto map_it = transmission_guest_id_list_.begin(); + map_it != transmission_guest_id_list_.end(); ++map_it) { + auto& list = map_it->second; auto it = std::find(list.begin(), list.end(), guest_id); if (it != list.end()) { list.erase(it); - if (list.empty()) transmission_guest_id_list_.erase(pair.first); + if (list.empty()) { + transmission_guest_id_list_.erase(map_it); + } return true; } } @@ -144,7 +147,12 @@ std::string TransmissionManager::ReleaseUserFromWsHandle( websocketpp::connection_hdl TransmissionManager::GetWsHandle( const std::string& user_id) { std::lock_guard lock(ws_hdl_alive_checker_mutex_); - return user_id_ws_hdl_list_[user_id]; + auto it = user_id_ws_hdl_list_.find(user_id); + if (it != user_id_ws_hdl_list_.end()) { + return it->second; + } + + return websocketpp::connection_hdl(); } std::string TransmissionManager::GetUserId(websocketpp::connection_hdl hdl) {