]> granicus.if.org Git - pdns/commitdiff
Gracefully handle cases where IPv6 (AF_INET6) is not supported.
authorYossi Gottlieb <yossigo@gmail.com>
Tue, 17 Nov 2015 10:18:34 +0000 (12:18 +0200)
committerYossi Gottlieb <yossigo@gmail.com>
Tue, 17 Nov 2015 10:18:34 +0000 (12:18 +0200)
This fixes issue #1259 and allows a single configuration file to be used
both for IPv6 enabled and IPv6-less systems.

pdns/nameserver.cc
pdns/resolver.cc

index c5539af22c7eb888b830cd54bbc7684882f42039..b068b9936af78ef3d51efeec48fccd32879b46a0 100644 (file)
@@ -206,8 +206,13 @@ void UDPNameserver::bindIPv6()
 
     s=socket(AF_INET6,SOCK_DGRAM,0);
     if(s<0) {
-      L<<Logger::Error<<"Unable to acquire UDPv6 socket: "+string(strerror(errno)) << endl;
-      throw PDNSException("Unable to acquire UDPv6 socket: "+string(strerror(errno)));
+      if( errno == EAFNOSUPPORT ) {
+        L<<Logger::Error<<"IPv6 Address Family is not supported - skipping UDPv6 bind" << endl;
+        return;
+      } else {
+        L<<Logger::Error<<"Unable to acquire a UDPv6 socket: "+string(strerror(errno)) << endl;
+        throw PDNSException("Unable to acquire a UDPv6 socket: "+string(strerror(errno)));
+      }
     }
 
     setCloseOnExec(s);
index b969fa39dc01c509dad7a14666984b36e95efa6d..83eebb328f575f1bb1702ca4cd4b73d8ac33dbe1 100644 (file)
@@ -56,11 +56,14 @@ int makeQuerySocket(const ComboAddress& local, bool udpOrTCP)
   ComboAddress ourLocal(local);
   
   int sock=socket(ourLocal.sin4.sin_family, udpOrTCP ? SOCK_DGRAM : SOCK_STREAM, 0);
-  setCloseOnExec(sock);
   if(sock < 0) {
-    unixDie("Creating local resolver socket for "+ourLocal.toString() + ((local.sin4.sin_family == AF_INET6) ? ", does your OS miss IPv6?" : ""));
+    if(errno == EAFNOSUPPORT && local.sin4.sin_family == AF_INET6) {
+        return sock;
+    }
+    unixDie("Creating local resolver socket for "+ourLocal.toString());
   }
 
+  setCloseOnExec(sock);
   if(udpOrTCP) {
     // udp, try hard to bind an unpredictable port
     int tries=10;