summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIgor Gapchuk (GitHub) <41586842+IGapchuk@users.noreply.github.com>2020-09-30 22:27:24 +0300
committerGitHub <noreply@github.com>2020-09-30 15:27:24 -0400
commit876856f1f2a6956bb6d14f32a26d484c0fd52499 (patch)
tree2d882284bbdeabb81b7107618cca72eda15b348a
parentefb3c1d5ecc3688db65110d3a3c10560d249f33e (diff)
downloadsdl_core-876856f1f2a6956bb6d14f32a26d484c0fd52499.tar.gz
Fix deadlock in connection_handler (#3496)
-rw-r--r--src/components/connection_handler/src/connection_handler_impl.cc20
1 files changed, 15 insertions, 5 deletions
diff --git a/src/components/connection_handler/src/connection_handler_impl.cc b/src/components/connection_handler/src/connection_handler_impl.cc
index d4364af8df..827d6fa17e 100644
--- a/src/components/connection_handler/src/connection_handler_impl.cc
+++ b/src/components/connection_handler/src/connection_handler_impl.cc
@@ -465,10 +465,21 @@ void ConnectionHandlerImpl::OnSessionStartedCallback(
return;
}
#endif // ENABLE_SECURITY
- sync_primitives::AutoReadLock lock(connection_list_lock_);
- ConnectionList::iterator it =
- connection_list_.find(primary_connection_handle);
- if (connection_list_.end() == it) {
+
+ auto find_connection =
+ [this](const transport_manager::ConnectionUID& primary_connection_handle)
+ -> Connection* {
+ sync_primitives::AutoReadLock lock(connection_list_lock_);
+ auto it = connection_list_.find(primary_connection_handle);
+ if (it != connection_list_.end()) {
+ return it->second;
+ }
+ return nullptr;
+ };
+
+ Connection* connection = find_connection(primary_connection_handle);
+
+ if (!connection) {
SDL_LOG_ERROR("Unknown connection!");
protocol_handler_->NotifySessionStarted(
context,
@@ -477,7 +488,6 @@ void ConnectionHandlerImpl::OnSessionStartedCallback(
return;
}
- Connection* connection = it->second;
context.is_new_service_ =
!connection->SessionServiceExists(session_id, service_type);