From 0b6de51600c4d38fded50cf2b9b05b1dfaf7a86c Mon Sep 17 00:00:00 2001 From: Otto Moerbeek Date: Tue, 1 Jul 2025 11:51:10 +0200 Subject: [PATCH] Only allow the failure if the incoming.listen settings is default Signed-off-by: Otto Moerbeek --- pdns/recursordist/pdns_recursor.cc | 5 ++++- pdns/recursordist/rec-tcp.cc | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) 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))); -- 2.47.2