]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
dnsdist: Fix a missing explicit atomic load of the Quiche configuration 13774/head
authorRemi Gacogne <remi.gacogne@powerdns.com>
Fri, 9 Feb 2024 14:28:57 +0000 (15:28 +0100)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Fri, 9 Feb 2024 14:28:57 +0000 (15:28 +0100)
Reported by TSAN.

pdns/dnsdistdist/doh3.cc
pdns/dnsdistdist/doq.cc

index d09adc65d6764d80959d8578e03d3fdd7605beda..f24e66c878924347fa1ae1d0797204126cb2faf1 100644 (file)
@@ -423,6 +423,7 @@ static void sendBackDOH3Unit(DOH3UnitUniquePtr&& unit, const char* description)
 
 static std::optional<std::reference_wrapper<H3Connection>> 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<std::reference_wrapper<H3Connection>> createConnection(DOH3
                                                    // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
                                                    reinterpret_cast<const struct sockaddr*>(&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;
index 42a072c3750b83e6b08eb11581d9a64c877cdbe3..f3f0b40e469dc3e25665c3e2c585d5ef75a3d336 100644 (file)
@@ -340,6 +340,7 @@ static void sendBackDOQUnit(DOQUnitUniquePtr&& unit, const char* description)
 
 static std::optional<std::reference_wrapper<Connection>> 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<std::reference_wrapper<Connection>> createConnection(DOQSer
                                                    // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
                                                    reinterpret_cast<const struct sockaddr*>(&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;