From: Remi Gacogne Date: Fri, 9 Feb 2024 14:28:57 +0000 (+0100) Subject: dnsdist: Fix a missing explicit atomic load of the Quiche configuration X-Git-Tag: dnsdist-1.9.0~4^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=refs%2Fpull%2F13774%2Fhead;p=thirdparty%2Fpdns.git dnsdist: Fix a missing explicit atomic load of the Quiche configuration Reported by TSAN. --- 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;