]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
Only allow the failure if the incoming.listen settings is default 15758/head
authorOtto Moerbeek <otto.moerbeek@open-xchange.com>
Tue, 1 Jul 2025 09:51:10 +0000 (11:51 +0200)
committerOtto Moerbeek <otto.moerbeek@open-xchange.com>
Tue, 1 Jul 2025 09:51:10 +0000 (11:51 +0200)
Signed-off-by: Otto Moerbeek <otto.moerbeek@open-xchange.com>
pdns/recursordist/pdns_recursor.cc
pdns/recursordist/rec-tcp.cc

index 22607c192de02d36db5bb41967364734e461b643..7bf3f83c76f967639329c3588a4e1797030c97a1 100644 (file)
@@ -2704,6 +2704,9 @@ unsigned int makeUDPServerSockets(deferredAdd_t& deferredAdds, Logr::log_t log,
   }
 
   const uint16_t defaultLocalPort = ::arg().asNum("local-port");
+  const vector<string> 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<struct sockaddr*>(&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)));
index 6ea1bc740131caf3fde2a453e78138aed58b8b46..9d51d6a949a8fd27898c8b5511e5b3b5bdf76981 100644 (file)
@@ -1109,6 +1109,9 @@ unsigned int makeTCPServerSockets(deferredAdd_t& deferredAdds, std::set<int>& tc
   auto first = true;
 #endif
   const uint16_t defaultLocalPort = ::arg().asNum("local-port");
+  const vector<string> 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<int>& tc
     socklen_t socklen = address.sin4.sin_family == AF_INET ? sizeof(address.sin4) : sizeof(address.sin6);
     if (::bind(socketFd, reinterpret_cast<struct sockaddr*>(&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)));