From: Otto Moerbeek Date: Tue, 1 Jul 2025 09:51:10 +0000 (+0200) Subject: Only allow the failure if the incoming.listen settings is default X-Git-Tag: rec-5.3.0-alpha2~19^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=refs%2Fpull%2F15758%2Fhead;p=thirdparty%2Fpdns.git Only allow the failure if the incoming.listen settings is default Signed-off-by: Otto Moerbeek --- diff --git a/pdns/recursordist/pdns_recursor.cc b/pdns/recursordist/pdns_recursor.cc index 22607c192d..7bf3f83c76 100644 --- a/pdns/recursordist/pdns_recursor.cc +++ b/pdns/recursordist/pdns_recursor.cc @@ -2704,6 +2704,9 @@ unsigned int makeUDPServerSockets(deferredAdd_t& deferredAdds, Logr::log_t log, } const uint16_t defaultLocalPort = ::arg().asNum("local-port"); + const vector defaultVector = {"127.0.0.1", "::1"}; + const auto configIsDefault = localAddresses == defaultVector; + for (const auto& localAddress : localAddresses) { ComboAddress address{localAddress, defaultLocalPort}; const int socketFd = socket(address.sin4.sin_family, SOCK_DGRAM, 0); @@ -2777,7 +2780,7 @@ unsigned int makeUDPServerSockets(deferredAdd_t& deferredAdds, Logr::log_t log, socklen_t socklen = address.getSocklen(); if (::bind(socketFd, reinterpret_cast(&address), socklen) < 0) { // NOLINT(cppcoreguidelines-pro-type-reinterpret-cast) int err = errno; - if (address != ComboAddress{"::1", defaultLocalPort}) { + if (!configIsDefault || address != ComboAddress{"::1", defaultLocalPort}) { throw PDNSException("Resolver binding to server socket on " + address.toStringWithPort() + ": " + stringerror(err)); } log->info(Logr::Warning, "Cannot listen on this address, skipping", "proto", Logging::Loggable("UDP"), "address", Logging::Loggable(address), "error", Logging::Loggable(stringerror(err))); diff --git a/pdns/recursordist/rec-tcp.cc b/pdns/recursordist/rec-tcp.cc index 6ea1bc7401..9d51d6a949 100644 --- a/pdns/recursordist/rec-tcp.cc +++ b/pdns/recursordist/rec-tcp.cc @@ -1109,6 +1109,9 @@ unsigned int makeTCPServerSockets(deferredAdd_t& deferredAdds, std::set& tc auto first = true; #endif const uint16_t defaultLocalPort = ::arg().asNum("local-port"); + const vector defaultVector = {"127.0.0.1", "::1"}; + const auto configIsDefault = localAddresses == defaultVector; + for (const auto& localAddress : localAddresses) { ComboAddress address{localAddress, defaultLocalPort}; const int socketFd = socket(address.sin6.sin6_family, SOCK_STREAM, 0); @@ -1178,7 +1181,7 @@ unsigned int makeTCPServerSockets(deferredAdd_t& deferredAdds, std::set& tc socklen_t socklen = address.sin4.sin_family == AF_INET ? sizeof(address.sin4) : sizeof(address.sin6); if (::bind(socketFd, reinterpret_cast(&address), socklen) < 0) { // NOLINT(cppcoreguidelines-pro-type-reinterpret-cast) int err = errno; - if (address != ComboAddress{"::1", defaultLocalPort}) { + if (!configIsDefault || address != ComboAddress{"::1", defaultLocalPort}) { throw PDNSException("Binding TCP server socket for " + address.toStringWithPort() + ": " + stringerror(err)); } log->info(Logr::Warning, "Cannot listen on this address, skipping", "proto", Logging::Loggable("TCP"), "address", Logging::Loggable(address), "error", Logging::Loggable(stringerror(err)));