From 5bc52f3ab161d9d588cc9805b9f06f4f8abfe749 Mon Sep 17 00:00:00 2001 From: Francis Tsui Date: Thu, 8 Aug 2024 18:24:14 -0700 Subject: [PATCH] internal. PiperOrigin-RevId: 661059307 --- sharing/nearby_sharing_service_impl.cc | 30 ++++++++++++++++++-------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/sharing/nearby_sharing_service_impl.cc b/sharing/nearby_sharing_service_impl.cc index 9ff624f5..5254cf85 100644 --- a/sharing/nearby_sharing_service_impl.cc +++ b/sharing/nearby_sharing_service_impl.cc @@ -336,7 +336,13 @@ void NearbySharingServiceImpl::Cleanup() { for (auto& it : incoming_share_session_map_) { it.second.OnDisconnect(); } - incoming_share_session_map_.clear(); + // Clear out the incoming_share_session_map_ before destroying the sessions. + // Session destruction can trigger callbacks that access the map. That is not + // allowed while the map is being modified. + absl::flat_hash_map tmp_incoming_session_map; + tmp_incoming_session_map.swap(incoming_share_session_map_); + tmp_incoming_session_map.clear(); + discovered_advertisements_to_retry_map_.clear(); discovered_advertisements_retried_set_.clear(); @@ -2398,14 +2404,20 @@ void NearbySharingServiceImpl::RemoveOutgoingShareTargetWithEndpointId( ShareTarget share_target = std::move(it->second); outgoing_share_target_map_.erase(it); - auto session_it = outgoing_share_session_map_.find(share_target.id); - if (session_it != outgoing_share_session_map_.end()) { - session_it->second.OnDisconnect(); - outgoing_share_session_map_.erase(session_it); - } else { - NL_LOG(WARNING) << __func__ << ": share_target.id=" << it->second.id - << " not found in outgoing share session map."; - return; + { + // Do not destroy the session until it has been removed from the map. + // Session destruction can trigger callbacks that traverses the map and it + // cannot access the map while it is being modified. + absl::flat_hash_map::node_type session_node; + auto session_it = outgoing_share_session_map_.find(share_target.id); + if (session_it != outgoing_share_session_map_.end()) { + session_node = outgoing_share_session_map_.extract(session_it); + session_node.mapped().OnDisconnect(); + } else { + NL_LOG(WARNING) << __func__ << ": share_target.id=" << it->second.id + << " not found in outgoing share session map."; + return; + } } for (auto& entry : foreground_send_surface_map_) {