From 0011a8253fde6c9e835861e059fb2ade0271be07 Mon Sep 17 00:00:00 2001 From: Remi Gacogne Date: Fri, 9 Feb 2024 15:28:57 +0100 Subject: [PATCH] dnsdist: Fix a missing explicit atomic load of the Quiche configuration Reported by TSAN. --- pdns/dnsdistdist/doh3.cc | 4 ++-- pdns/dnsdistdist/doq.cc | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pdns/dnsdistdist/doh3.cc b/pdns/dnsdistdist/doh3.cc index d09adc65d6..f24e66c878 100644 --- a/pdns/dnsdistdist/doh3.cc +++ b/pdns/dnsdistdist/doh3.cc @@ -423,6 +423,7 @@ static void sendBackDOH3Unit(DOH3UnitUniquePtr&& unit, const char* description) static std::optional> createConnection(DOH3ServerConfig& config, const PacketBuffer& serverSideID, const PacketBuffer& originalDestinationID, const ComboAddress& local, const ComboAddress& peer) { + auto quicheConfig = std::atomic_load_explicit(&config.config, std::memory_order_acquire); auto quicheConn = QuicheConnection(quiche_accept(serverSideID.data(), serverSideID.size(), originalDestinationID.data(), originalDestinationID.size(), // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) @@ -431,14 +432,13 @@ static std::optional> createConnection(DOH3 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) reinterpret_cast(&peer), peer.getSocklen(), - config.config.get()), + quicheConfig.get()), quiche_conn_free); if (config.df && !config.df->d_quicheParams.d_keyLogFile.empty()) { quiche_conn_set_keylog_path(quicheConn.get(), config.df->d_quicheParams.d_keyLogFile.c_str()); } - auto quicheConfig = std::atomic_load_explicit(&config.config, std::memory_order_acquire); auto conn = H3Connection(peer, quicheConfig, std::move(quicheConn)); auto pair = config.d_connections.emplace(serverSideID, std::move(conn)); return pair.first->second; diff --git a/pdns/dnsdistdist/doq.cc b/pdns/dnsdistdist/doq.cc index 42a072c375..f3f0b40e46 100644 --- a/pdns/dnsdistdist/doq.cc +++ b/pdns/dnsdistdist/doq.cc @@ -340,6 +340,7 @@ static void sendBackDOQUnit(DOQUnitUniquePtr&& unit, const char* description) static std::optional> createConnection(DOQServerConfig& config, const PacketBuffer& serverSideID, const PacketBuffer& originalDestinationID, const ComboAddress& local, const ComboAddress& peer) { + auto quicheConfig = std::atomic_load_explicit(&config.config, std::memory_order_acquire); auto quicheConn = QuicheConnection(quiche_accept(serverSideID.data(), serverSideID.size(), originalDestinationID.data(), originalDestinationID.size(), // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) @@ -348,14 +349,13 @@ static std::optional> createConnection(DOQSer // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) reinterpret_cast(&peer), peer.getSocklen(), - config.config.get()), + quicheConfig.get()), quiche_conn_free); if (config.df && !config.df->d_quicheParams.d_keyLogFile.empty()) { quiche_conn_set_keylog_path(quicheConn.get(), config.df->d_quicheParams.d_keyLogFile.c_str()); } - auto quicheConfig = std::atomic_load_explicit(&config.config, std::memory_order_acquire); auto conn = Connection(peer, quicheConfig, std::move(quicheConn)); auto pair = config.d_connections.emplace(serverSideID, std::move(conn)); return pair.first->second; -- 2.47.2