]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
rec: fix two Coverity reported resource leaks and add release() to FDWrapper() 15766/head
authorOtto Moerbeek <otto.moerbeek@open-xchange.com>
Wed, 2 Jul 2025 09:14:08 +0000 (11:14 +0200)
committerOtto Moerbeek <otto.moerbeek@open-xchange.com>
Wed, 2 Jul 2025 09:14:08 +0000 (11:14 +0200)
Signed-off-by: Otto Moerbeek <otto.moerbeek@open-xchange.com>
pdns/misc.hh
pdns/recursordist/pdns_recursor.cc
pdns/recursordist/rec-tcp.cc

index f4796250ce27f81e67034dc70de35da2a9195bc6..2db0a2ec0898778763b39e3e799690ea7aec53f4 100644 (file)
@@ -865,6 +865,13 @@ struct FDWrapper
     return ret;
   }
 
+  int release()
+  {
+    auto ret = d_fd;
+    d_fd = -1;
+    return ret;
+  }
+
 private:
   int d_fd{-1};
 };
index f0fb1a0dffdee1b1363f6e5fbf893288b26cb930..b842807d0ba5ffc092ebbdc6a5a8399bf8cb3292 100644 (file)
@@ -2707,7 +2707,7 @@ unsigned int makeUDPServerSockets(deferredAdd_t& deferredAdds, Logr::log_t log,
 
   for (const auto& localAddress : localAddresses) {
     ComboAddress address{localAddress, defaultLocalPort};
-    const int socketFd = socket(address.sin4.sin_family, SOCK_DGRAM, 0);
+    auto socketFd = FDWrapper(socket(address.sin4.sin_family, SOCK_DGRAM, 0));
     if (socketFd < 0) {
       throw PDNSException("Making a UDP server socket for resolver: " + stringerror());
     }
@@ -2790,6 +2790,7 @@ unsigned int makeUDPServerSockets(deferredAdd_t& deferredAdds, Logr::log_t log,
     deferredAdds.emplace_back(socketFd, handleNewUDPQuestion);
     g_listenSocketsAddresses[socketFd] = address; // this is written to only from the startup thread, not from the workers
     logVec.emplace_back(address.toStringWithPort());
+    socketFd.release(); // to avoid auto-close by FDWrapper
   }
   if (doLog) {
     log->info(Logr::Info, "Listening for queries", "proto", Logging::Loggable("UDP"), "addresses", Logging::IterLoggable(logVec.cbegin(), logVec.cend()), "socketInstances", Logging::Loggable(instances), "reuseport", Logging::Loggable(g_reusePort));
index 925239109798cd11d857f6feda8b94563ad60e65..84837293e5dd5df55af9e36a38ae5aef9717804d 100644 (file)
@@ -1113,7 +1113,7 @@ unsigned int makeTCPServerSockets(deferredAdd_t& deferredAdds, std::set<int>& tc
 
   for (const auto& localAddress : localAddresses) {
     ComboAddress address{localAddress, defaultLocalPort};
-    const int socketFd = socket(address.sin6.sin6_family, SOCK_STREAM, 0);
+    auto socketFd = FDWrapper(socket(address.sin6.sin6_family, SOCK_STREAM, 0));
     if (socketFd < 0) {
       throw PDNSException("Making a TCP server socket for resolver: " + stringerror());
     }
@@ -1207,6 +1207,7 @@ unsigned int makeTCPServerSockets(deferredAdd_t& deferredAdds, std::set<int>& tc
 #ifdef TCP_DEFER_ACCEPT
     first = false;
 #endif
+    socketFd.release(); // to avoid auto-close by FDWrapper
   }
   if (doLog) {
     log->info(Logr::Info, "Listening for queries", "protocol", Logging::Loggable("TCP"), "addresses", Logging::IterLoggable(logVec.cbegin(), logVec.cend()), "socketInstances", Logging::Loggable(instances), "reuseport", Logging::Loggable(g_reusePort));