]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
dnsdist: Move the NetworkListener's data earlier to prevent a race
authorRemi Gacogne <remi.gacogne@powerdns.com>
Mon, 18 May 2026 11:03:09 +0000 (13:03 +0200)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Mon, 18 May 2026 11:03:09 +0000 (13:03 +0200)
Signed-off-by: Remi Gacogne <remi.gacogne@powerdns.com>
pdns/dnsdistdist/dnsdist-lua-network.cc
pdns/dnsdistdist/dnsdist-lua-network.hh

index 95af07beb87f3e3fb7b24d3cfe273d6ee5f91b06..2802e4e3e7ef327aa73984f756de193d6667c94d 100644 (file)
@@ -161,12 +161,9 @@ void NetworkListener::runOnce(timeval& now, uint32_t timeout)
   runOnce(*d_data, now, timeout);
 }
 
-void NetworkListener::mainThread(std::shared_ptr<ListenerData>& dataArg)
+// NOLINTNEXTLINE(performance-unnecessary-value-param): take our own copy of the shared_ptr so it's still alive if the NetworkListener object gets destroyed while we are still running
+void NetworkListener::mainThread(std::shared_ptr<ListenerData> data)
 {
-  /* take our own copy of the shared_ptr so it's still alive if the NetworkListener object
-     gets destroyed while we are still running */
-  // NOLINTNEXTLINE(performance-unnecessary-copy-initialization): we really need a copy here, or we end up with use-after-free as explained above
-  auto data = dataArg;
   setThreadName("dnsdist/lua-net");
   timeval now{};
 
@@ -177,8 +174,8 @@ void NetworkListener::mainThread(std::shared_ptr<ListenerData>& dataArg)
 
 void NetworkListener::start()
 {
-  std::thread main = std::thread([this] {
-    mainThread(d_data);
+  std::thread main = std::thread([data = d_data]() mutable {
+    mainThread(std::move(data));
   });
   main.detach();
 }
index 3cd2f08442713f280da31cf24c35c071226a9ae7..85db8277ee3ede1371ccc89e723d28c8d35c66b4 100644 (file)
@@ -58,7 +58,7 @@ private:
   };
 
   static void readCB(int desc, FDMultiplexer::funcparam_t& param);
-  static void mainThread(std::shared_ptr<ListenerData>& data);
+  static void mainThread(std::shared_ptr<ListenerData> data);
   static void runOnce(ListenerData& data, timeval& now, uint32_t timeout);
 
   struct CBData