]> granicus.if.org Git - pdns/commitdiff
Resolover::resolve: dont second guess local socket choice
authorChris Hofstaedtler <chris.hofstaedtler@deduktiva.com>
Tue, 9 Jan 2018 19:13:12 +0000 (20:13 +0100)
committerChris Hofstaedtler <chris.hofstaedtler@deduktiva.com>
Tue, 9 Jan 2018 19:13:12 +0000 (20:13 +0100)
pdns/resolver.cc
pdns/resolver.hh
pdns/slavecommunicator.cc

index dd9b6b3bbfcea983f81f3ea0571df971b95809d2..ec0343aac8e6f7a81fe4071ed76a5968037b87dd 100644 (file)
@@ -119,7 +119,7 @@ Resolver::~Resolver()
 }
 
 uint16_t Resolver::sendResolve(const ComboAddress& remote, const ComboAddress& local,
-                               const DNSName &domain, int type, bool dnssecOK,
+                               const DNSName &domain, int type, int *localsock, bool dnssecOK,
                                const DNSName& tsigkeyname, const DNSName& tsigalgorithm,
                                const string& tsigsecret)
 {
@@ -170,6 +170,9 @@ uint16_t Resolver::sendResolve(const ComboAddress& remote, const ComboAddress& l
     }
   }
 
+  if (localsock != nullptr) {
+    *localsock = sock;
+  }
   if(sendto(sock, &packet[0], packet.size(), 0, (struct sockaddr*)(&remote), remote.getSocklen()) < 0) {
     throw ResolverException("Unable to ask query of "+remote.toStringWithPort()+": "+stringerror());
   }
@@ -285,22 +288,8 @@ int Resolver::resolve(const string &ipport, const DNSName &domain, int type, Res
   try {
     ComboAddress to(ipport, 53);
 
-    int id = sendResolve(to, local, domain, type);
-    int sock;
-
-    // choose socket based on local
-    if (local.sin4.sin_family == 0) {
-      // up to us.
-      sock = to.sin4.sin_family == AF_INET ? locals["default4"] : locals["default6"];
-    } else {
-      std::string lstr = local.toString();
-      std::map<std::string, int>::iterator lptr;
-      // see if there is a local
-
-      if ((lptr = locals.find(lstr)) != locals.end()) sock = lptr->second;
-      else throw ResolverException("sendResolve did not create socket for " + lstr);
-    }
-
+    int sock = -1;
+    int id = sendResolve(to, local, domain, type, &sock);
     int err=waitForData(sock, 0, 3000000); 
   
     if(!err) {
index a0ad541d5268219a282ababde4a149287d02e1b5..57c28b65a553db14427924a07c1355ebbb6cddba 100644 (file)
@@ -65,7 +65,7 @@ public:
   int resolve(const string &ip, const DNSName &domain, int type, res_t* result);
 
   //! only send out a resolution request
-  uint16_t sendResolve(const ComboAddress& remote, const ComboAddress& local, const DNSName &domain, int type, bool dnssecOk=false,
+  uint16_t sendResolve(const ComboAddress& remote, const ComboAddress& local, const DNSName &domain, int type, int *localsock, bool dnssecOk=false,
     const DNSName& tsigkeyname=DNSName(), const DNSName& tsigalgorithm=DNSName(), const string& tsigsecret="");
 
   //! see if we got a SOA response from our sendResolve
index f777990825e49e323afb1e4fd5151c1f882f6d52..19ed09cda073be045b936c088ced2f3685a82669 100644 (file)
@@ -666,6 +666,7 @@ struct SlaveSenderReceiver
         d_resolver.sendResolve(ComboAddress(*dni.di.masters.begin(), 53), dni.localaddr,
           dni.di.zone,
           QType::SOA,
+          nullptr,
           dni.dnssecOk, dni.tsigkeyname, dni.tsigalgname, dni.tsigsecret)
       );
     }