From: Chris Hofstaedtler Date: Tue, 9 Jan 2018 19:13:12 +0000 (+0100) Subject: Resolover::resolve: dont second guess local socket choice X-Git-Tag: dnsdist-1.3.0~151^2~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7f24b6c66a12cb544dfc9511437e6636eb5800c8;p=thirdparty%2Fpdns.git Resolover::resolve: dont second guess local socket choice --- diff --git a/pdns/resolver.cc b/pdns/resolver.cc index dd9b6b3bbf..ec0343aac8 100644 --- a/pdns/resolver.cc +++ b/pdns/resolver.cc @@ -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::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) { diff --git a/pdns/resolver.hh b/pdns/resolver.hh index a0ad541d52..57c28b65a5 100644 --- a/pdns/resolver.hh +++ b/pdns/resolver.hh @@ -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 diff --git a/pdns/slavecommunicator.cc b/pdns/slavecommunicator.cc index f777990825..19ed09cda0 100644 --- a/pdns/slavecommunicator.cc +++ b/pdns/slavecommunicator.cc @@ -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) ); }