From: Otto Moerbeek Date: Wed, 2 Jul 2025 09:14:08 +0000 (+0200) Subject: rec: fix two Coverity reported resource leaks and add release() to FDWrapper() X-Git-Tag: rec-5.3.0-alpha2~13^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=refs%2Fpull%2F15766%2Fhead;p=thirdparty%2Fpdns.git rec: fix two Coverity reported resource leaks and add release() to FDWrapper() Signed-off-by: Otto Moerbeek --- diff --git a/pdns/misc.hh b/pdns/misc.hh index f4796250ce..2db0a2ec08 100644 --- a/pdns/misc.hh +++ b/pdns/misc.hh @@ -865,6 +865,13 @@ struct FDWrapper return ret; } + int release() + { + auto ret = d_fd; + d_fd = -1; + return ret; + } + private: int d_fd{-1}; }; diff --git a/pdns/recursordist/pdns_recursor.cc b/pdns/recursordist/pdns_recursor.cc index f0fb1a0dff..b842807d0b 100644 --- a/pdns/recursordist/pdns_recursor.cc +++ b/pdns/recursordist/pdns_recursor.cc @@ -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)); diff --git a/pdns/recursordist/rec-tcp.cc b/pdns/recursordist/rec-tcp.cc index 9252391097..84837293e5 100644 --- a/pdns/recursordist/rec-tcp.cc +++ b/pdns/recursordist/rec-tcp.cc @@ -1113,7 +1113,7 @@ unsigned int makeTCPServerSockets(deferredAdd_t& deferredAdds, std::set& 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& 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));