]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
format dnsproxy.{cc,hh}, ednssubnet.{cc,hh}, stubresolver.cc
authorPeter van Dijk <peter.van.dijk@powerdns.com>
Thu, 11 Jan 2024 11:01:24 +0000 (12:01 +0100)
committerPeter van Dijk <peter.van.dijk@powerdns.com>
Thu, 11 Jan 2024 11:01:24 +0000 (12:01 +0100)
.not-formatted
pdns/dnsproxy.cc
pdns/dnsproxy.hh
pdns/ednssubnet.cc
pdns/ednssubnet.hh
pdns/stubresolver.cc

index fc8ed5abd87b8d2f13ccfef782a8d0e91a377800..efd77b72f38d4c04f413530c01c0110792c1e0c9 100644 (file)
 ./pdns/dnspcap.hh
 ./pdns/dnspcap2calidns.cc
 ./pdns/dnspcap2protobuf.cc
-./pdns/dnsproxy.cc
-./pdns/dnsproxy.hh
 ./pdns/dnsrecords.cc
 ./pdns/dnsrecords.hh
 ./pdns/dnsreplay.cc
 ./pdns/ednsoptions.cc
 ./pdns/ednsoptions.hh
 ./pdns/ednspadding.cc
-./pdns/ednssubnet.cc
-./pdns/ednssubnet.hh
 ./pdns/fstrm_logger.cc
 ./pdns/fstrm_logger.hh
 ./pdns/gettime.cc
 ./pdns/statnode.cc
 ./pdns/statnode.hh
 ./pdns/stubquery.cc
-./pdns/stubresolver.cc
 ./pdns/svc-records.cc
 ./pdns/svc-records.hh
 ./pdns/tcpiohandler.cc
index 6482b67cf12bf361975302562c00c08a86e54524..7ff8c873e5a8ebfeb38e9e208307813b399b421b 100644 (file)
 
 extern StatBag S;
 
-DNSProxy::DNSProxy(const string &remote): d_xor(dns_random_uint16())
+DNSProxy::DNSProxy(const string& remote) :
+  d_xor(dns_random_uint16())
 {
-  d_resanswers=S.getPointer("recursing-answers");
-  d_resquestions=S.getPointer("recursing-questions");
-  d_udpanswers=S.getPointer("udp-answers");
+  d_resanswers = S.getPointer("recursing-answers");
+  d_resquestions = S.getPointer("recursing-questions");
+  d_udpanswers = S.getPointer("udp-answers");
 
   vector<string> addresses;
   stringtok(addresses, remote, " ,\t");
   d_remote = ComboAddress(addresses[0], 53);
 
-  if((d_sock=socket(d_remote.sin4.sin_family, SOCK_DGRAM,0))<0) {
-    throw PDNSException(string("socket: ")+stringerror());
+  if ((d_sock = socket(d_remote.sin4.sin_family, SOCK_DGRAM, 0)) < 0) {
+    throw PDNSException(string("socket: ") + stringerror());
   }
 
   ComboAddress local;
-  if(d_remote.sin4.sin_family==AF_INET) {
+  if (d_remote.sin4.sin_family == AF_INET) {
     local = ComboAddress("0.0.0.0");
   }
   else {
     local = ComboAddress("::");
   }
-    
-  unsigned int n=0;
-  for(;n<10;n++) {
-    local.sin4.sin_port = htons(10000+dns_random(50000));
-    
-    if(::bind(d_sock, (struct sockaddr *)&local, local.getSocklen()) >= 0) 
+
+  unsigned int n = 0;
+  for (; n < 10; n++) {
+    local.sin4.sin_port = htons(10000 + dns_random(50000));
+
+    if (::bind(d_sock, (struct sockaddr*)&local, local.getSocklen()) >= 0)
       break;
   }
-  if(n==10) {
+  if (n == 10) {
     closesocket(d_sock);
-    d_sock=-1;
-    throw PDNSException(string("binding dnsproxy socket: ")+stringerror());
+    d_sock = -1;
+    throw PDNSException(string("binding dnsproxy socket: ") + stringerror());
   }
 
-  if(connect(d_sock, (sockaddr *)&d_remote, d_remote.getSocklen())<0) {
-    throw PDNSException("Unable to UDP connect to remote nameserver "+d_remote.toStringWithPort()+": "+stringerror());
+  if (connect(d_sock, (sockaddr*)&d_remote, d_remote.getSocklen()) < 0) {
+    throw PDNSException("Unable to UDP connect to remote nameserver " + d_remote.toStringWithPort() + ": " + stringerror());
   }
 
-  g_log<<Logger::Error<<"DNS Proxy launched, local port "<<ntohs(local.sin4.sin_port)<<", remote "<<d_remote.toStringWithPort()<<endl;
-} 
+  g_log << Logger::Error << "DNS Proxy launched, local port " << ntohs(local.sin4.sin_port) << ", remote " << d_remote.toStringWithPort() << endl;
+}
 
 void DNSProxy::go()
 {
-  std::thread t([this](){mainloop();});
+  std::thread t([this]() { mainloop(); });
   t.detach();
 }
 
 //! look up qname target with r->qtype, plonk it in the answer section of 'r' with name aname
-bool DNSProxy::completePacket(std::unique_ptr<DNSPacket>& r, const DNSName& target,const DNSName& aname, const uint8_t scopeMask)
+bool DNSProxy::completePacket(std::unique_ptr<DNSPacket>& r, const DNSName& target, const DNSName& aname, const uint8_t scopeMask)
 {
   string ECSOptionStr;
 
-  if (r->hasEDNSSubnet())
-  {
-    DLOG(g_log<<"dnsproxy::completePacket: Parsed edns source: "<<r->d_eso.source.toString()<<", scope: "<<r->d_eso.scope.toString()<<", family = "<<r->d_eso.scope.getNetwork().sin4.sin_family<<endl);
+  if (r->hasEDNSSubnet()) {
+    DLOG(g_log << "dnsproxy::completePacket: Parsed edns source: " << r->d_eso.source.toString() << ", scope: " << r->d_eso.scope.toString() << ", family = " << r->d_eso.scope.getNetwork().sin4.sin_family << endl);
     ECSOptionStr = makeEDNSSubnetOptsString(r->d_eso);
-    DLOG(g_log<<"from dnsproxy::completePacket: Creating ECS option string "<<makeHexDump(ECSOptionStr)<<endl);
+    DLOG(g_log << "from dnsproxy::completePacket: Creating ECS option string " << makeHexDump(ECSOptionStr) << endl);
   }
 
-  if(r->d_tcp) {
+  if (r->d_tcp) {
     vector<DNSZoneRecord> ips;
     int ret1 = 0, ret2 = 0;
     // rip out edns info here, pass it to the stubDoResolve
-    if(r->qtype == QType::A || r->qtype == QType::ANY)
+    if (r->qtype == QType::A || r->qtype == QType::ANY)
       ret1 = stubDoResolve(target, QType::A, ips, r->hasEDNSSubnet() ? &r->d_eso : nullptr);
-    if(r->qtype == QType::AAAA || r->qtype == QType::ANY)
+    if (r->qtype == QType::AAAA || r->qtype == QType::ANY)
       ret2 = stubDoResolve(target, QType::AAAA, ips, r->hasEDNSSubnet() ? &r->d_eso : nullptr);
 
-    if(ret1 != RCode::NoError || ret2 != RCode::NoError) {
-      g_log<<Logger::Error<<"Error resolving for "<<aname<<" ALIAS "<<target<<" over UDP, original query came in over TCP";
+    if (ret1 != RCode::NoError || ret2 != RCode::NoError) {
+      g_log << Logger::Error << "Error resolving for " << aname << " ALIAS " << target << " over UDP, original query came in over TCP";
       if (ret1 != RCode::NoError) {
-       g_log<<Logger::Error<<", A-record query returned "<<RCode::to_s(ret1);
+        g_log << Logger::Error << ", A-record query returned " << RCode::to_s(ret1);
       }
       if (ret2 != RCode::NoError) {
-       g_log<<Logger::Error<<", AAAA-record query returned "<<RCode::to_s(ret2);
+        g_log << Logger::Error << ", AAAA-record query returned " << RCode::to_s(ret2);
       }
-      g_log<<Logger::Error<<", returning SERVFAIL"<<endl;
+      g_log << Logger::Error << ", returning SERVFAIL" << endl;
       r->clearRecords();
       r->setRcode(RCode::ServFail);
-    } else {
-      for (auto &ip : ips)
-      {
+    }
+    else {
+      for (auto& ip : ips) {
         ip.dr.d_name = aname;
         r->addRecord(std::move(ip));
       }
     }
 
-    uint16_t len=htons(r->getString().length());
+    uint16_t len = htons(r->getString().length());
     string buffer((const char*)&len, 2);
     buffer.append(r->getString());
-    writen2WithTimeout(r->getSocket(), buffer.c_str(), buffer.length(), timeval{::arg().asNum("tcp-idle-timeout"),0});
+    writen2WithTimeout(r->getSocket(), buffer.c_str(), buffer.length(), timeval{::arg().asNum("tcp-idle-timeout"), 0});
 
     return true;
   }
@@ -145,57 +145,53 @@ bool DNSProxy::completePacket(std::unique_ptr<DNSPacket>& r, const DNSName& targ
     id = getID_locked(*conntrack);
 
     ConntrackEntry ce;
-    ce.id       = r->d.id;
-    ce.remote =   r->d_remote;
-    ce.outsock  = r->getSocket();
-    ce.created  = time( nullptr );
+    ce.id = r->d.id;
+    ce.remote = r->d_remote;
+    ce.outsock = r->getSocket();
+    ce.created = time(nullptr);
     ce.qtype = r->qtype.getCode();
     ce.qname = target;
     ce.anyLocal = r->d_anyLocal;
     ce.complete = std::move(r);
-    ce.aname=aname;
+    ce.aname = aname;
     ce.anameScopeMask = scopeMask;
-    (*conntrack)[id]=std::move(ce);
+    (*conntrack)[id] = std::move(ce);
   }
 
   vector<uint8_t> packet;
   DNSPacketWriter pw(packet, target, qtype);
-  pw.getHeader()->rd=true;
-  pw.getHeader()->id=id ^ d_xor;
+  pw.getHeader()->rd = true;
+  pw.getHeader()->id = id ^ d_xor;
   // Add EDNS Subnet if the client sent one - issue #5469
   if (!ECSOptionStr.empty()) {
-    DLOG(g_log<<"from dnsproxy::completePacket: adding ECS option string to packet options "<<makeHexDump(ECSOptionStr)<<endl);
+    DLOG(g_log << "from dnsproxy::completePacket: adding ECS option string to packet options " << makeHexDump(ECSOptionStr) << endl);
     DNSPacketWriter::optvect_t opts;
     opts.emplace_back(EDNSOptionCode::ECS, ECSOptionStr);
     pw.addOpt(512, 0, 0, opts);
     pw.commit();
   }
 
-  if(send(d_sock,&packet[0], packet.size() , 0)<0) { // zoom
-    g_log<<Logger::Error<<"Unable to send a packet to our recursing backend: "<<stringerror()<<endl;
+  if (send(d_sock, &packet[0], packet.size(), 0) < 0) { // zoom
+    g_log << Logger::Error << "Unable to send a packet to our recursing backend: " << stringerror() << endl;
   }
 
   return true;
-
 }
 
-
 /** This finds us an unused or stale ID. Does not actually clean the contents */
 int DNSProxy::getID_locked(map_t& conntrack)
 {
   map_t::iterator i;
-  for(int n=0;;++n) {
-    i=conntrack.find(n);
-    if(i==conntrack.end()) {
+  for (int n = 0;; ++n) {
+    i = conntrack.find(n);
+    if (i == conntrack.end()) {
       return n;
     }
-    else if(i->second.created<time(nullptr)-60) {
-      if(i->second.created) {
-        g_log<<Logger::Warning<<"Recursive query for remote "<<
-          i->second.remote.toStringWithPort()<<" with internal id "<<n<<
-          " was not answered by backend within timeout, reusing id"<<endl;
-       i->second.complete.reset();
-       S.inc("recursion-unanswered");
+    else if (i->second.created < time(nullptr) - 60) {
+      if (i->second.created) {
+        g_log << Logger::Warning << "Recursive query for remote " << i->second.remote.toStringWithPort() << " with internal id " << n << " was not answered by backend within timeout, reusing id" << endl;
+        i->second.complete.reset();
+        S.inc("recursion-unanswered");
       }
       return n;
     }
@@ -214,53 +210,51 @@ void DNSProxy::mainloop()
     cmsgbuf_aligned cbuf;
     ComboAddress fromaddr;
 
-    for(;;) {
+    for (;;) {
       socklen_t fromaddrSize = sizeof(fromaddr);
-      len=recvfrom(d_sock, buffer, sizeof(buffer),0, (struct sockaddr*) &fromaddr, &fromaddrSize); // answer from our backend
-      if(len<(ssize_t)sizeof(dnsheader)) {
-        if(len<0)
-          g_log<<Logger::Error<<"Error receiving packet from recursor backend: "<<stringerror()<<endl;
-        else if(len==0)
-          g_log<<Logger::Error<<"Error receiving packet from recursor backend, EOF"<<endl;
+      len = recvfrom(d_sock, buffer, sizeof(buffer), 0, (struct sockaddr*)&fromaddr, &fromaddrSize); // answer from our backend
+      if (len < (ssize_t)sizeof(dnsheader)) {
+        if (len < 0)
+          g_log << Logger::Error << "Error receiving packet from recursor backend: " << stringerror() << endl;
+        else if (len == 0)
+          g_log << Logger::Error << "Error receiving packet from recursor backend, EOF" << endl;
         else
-          g_log<<Logger::Error<<"Short packet from recursor backend, "<<len<<" bytes"<<endl;
-        
+          g_log << Logger::Error << "Short packet from recursor backend, " << len << " bytes" << endl;
+
         continue;
       }
       if (fromaddr != d_remote) {
-        g_log<<Logger::Error<<"Got answer from unexpected host "<<fromaddr.toStringWithPort()<<" instead of our recursor backend "<<d_remote.toStringWithPort()<<endl;
+        g_log << Logger::Error << "Got answer from unexpected host " << fromaddr.toStringWithPort() << " instead of our recursor backend " << d_remote.toStringWithPort() << endl;
         continue;
       }
       (*d_resanswers)++;
       (*d_udpanswers)++;
       dnsheader d;
-      memcpy(&d,buffer,sizeof(d));
+      memcpy(&d, buffer, sizeof(d));
       {
         auto conntrack = d_conntrack.lock();
 #if BYTE_ORDER == BIG_ENDIAN
         // this is needed because spoof ID down below does not respect the native byteorder
-        d.id = ( 256 * (uint16_t)buffer[1] ) + (uint16_t)buffer[0];  
+        d.id = (256 * (uint16_t)buffer[1]) + (uint16_t)buffer[0];
 #endif
-        map_t::iterator i=conntrack->find(d.id^d_xor);
-        if(i==conntrack->end()) {
-          g_log<<Logger::Error<<"Discarding untracked packet from recursor backend with id "<<(d.id^d_xor)<<
-            ". Conntrack table size="<<conntrack->size()<<endl;
+        map_t::iterator i = conntrack->find(d.id ^ d_xor);
+        if (i == conntrack->end()) {
+          g_log << Logger::Error << "Discarding untracked packet from recursor backend with id " << (d.id ^ d_xor) << ". Conntrack table size=" << conntrack->size() << endl;
           continue;
         }
-        else if(i->second.created==0) {
-          g_log<<Logger::Error<<"Received packet from recursor backend with id "<<(d.id^d_xor)<<" which is a duplicate"<<endl;
+        else if (i->second.created == 0) {
+          g_log << Logger::Error << "Received packet from recursor backend with id " << (d.id ^ d_xor) << " which is a duplicate" << endl;
           continue;
         }
-       
-        d.id=i->second.id;
-        memcpy(buffer,&d,sizeof(d));  // commit spoofed id
+
+        d.id = i->second.id;
+        memcpy(buffer, &d, sizeof(d)); // commit spoofed id
 
         DNSPacket p(false);
-        p.parse(buffer,(size_t)len);
+        p.parse(buffer, (size_t)len);
 
-        if(p.qtype.getCode() != i->second.qtype || p.qdomain != i->second.qname) {
-          g_log<<Logger::Error<<"Discarding packet from recursor backend with id "<<(d.id^d_xor)<<
-            ", qname or qtype mismatch ("<<p.qtype.getCode()<<" v " <<i->second.qtype<<", "<<p.qdomain<<" v "<<i->second.qname<<")"<<endl;
+        if (p.qtype.getCode() != i->second.qtype || p.qdomain != i->second.qname) {
+          g_log << Logger::Error << "Discarding packet from recursor backend with id " << (d.id ^ d_xor) << ", qname or qtype mismatch (" << p.qtype.getCode() << " v " << i->second.qtype << ", " << p.qdomain << " v " << i->second.qname << ")" << endl;
           continue;
         }
 
@@ -271,18 +265,18 @@ void DNSProxy::mainloop()
         // update the EDNS options with info from the resolver - issue #5469
         // note that this relies on the ECS string encoder to use the source network, and only take the prefix length from scope
         i->second.complete->d_eso.scope = p.d_eso.scope;
-        DLOG(g_log<<"from dnsproxy::mainLoop: updated EDNS options from resolver EDNS source: "<<i->second.complete->d_eso.source.toString()<<" EDNS scope: "<<i->second.complete->d_eso.scope.toString()<<endl);
+        DLOG(g_log << "from dnsproxy::mainLoop: updated EDNS options from resolver EDNS source: " << i->second.complete->d_eso.source.toString() << " EDNS scope: " << i->second.complete->d_eso.scope.toString() << endl);
 
         if (mdp.d_header.rcode == RCode::NoError) {
-          for (const auto & answer : mdp.d_answers) {        
-            if(answer.first.d_place == DNSResourceRecord::ANSWER || (answer.first.d_place == DNSResourceRecord::AUTHORITY && answer.first.d_type == QType::SOA)) {
+          for (const auto& answer : mdp.d_answers) {
+            if (answer.first.d_place == DNSResourceRecord::ANSWER || (answer.first.d_place == DNSResourceRecord::AUTHORITY && answer.first.d_type == QType::SOA)) {
 
-              if(answer.first.d_type == i->second.qtype || (i->second.qtype == QType::ANY && (answer.first.d_type == QType::A || answer.first.d_type == QType::AAAA))) {
+              if (answer.first.d_type == i->second.qtype || (i->second.qtype == QType::ANY && (answer.first.d_type == QType::A || answer.first.d_type == QType::AAAA))) {
                 DNSZoneRecord dzr;
-                dzr.dr.d_name=i->second.aname;
+                dzr.dr.d_name = i->second.aname;
                 dzr.dr.d_type = answer.first.d_type;
-                dzr.dr.d_ttl=answer.first.d_ttl;
-                dzr.dr.d_place= answer.first.d_place;
+                dzr.dr.d_ttl = answer.first.d_ttl;
+                dzr.dr.d_place = answer.first.d_place;
                 dzr.dr.setContent(answer.first.getContent());
                 i->second.complete->addRecord(std::move(dzr));
               }
@@ -290,12 +284,13 @@ void DNSProxy::mainloop()
           }
 
           i->second.complete->setRcode(mdp.d_header.rcode);
-        } else {
-          g_log<<Logger::Error<<"Error resolving for "<<i->second.aname<<" ALIAS "<<i->second.qname<<" over UDP, "<<QType(i->second.qtype).toString()<<"-record query returned "<<RCode::to_s(mdp.d_header.rcode)<<", returning SERVFAIL"<<endl;
+        }
+        else {
+          g_log << Logger::Error << "Error resolving for " << i->second.aname << " ALIAS " << i->second.qname << " over UDP, " << QType(i->second.qtype).toString() << "-record query returned " << RCode::to_s(mdp.d_header.rcode) << ", returning SERVFAIL" << endl;
           i->second.complete->clearRecords();
           i->second.complete->setRcode(RCode::ServFail);
         }
-        reply=i->second.complete->getString();
+        reply = i->second.complete->getString();
         iov.iov_base = (void*)reply.c_str();
         iov.iov_len = reply.length();
         i->second.complete.reset();
@@ -303,41 +298,41 @@ void DNSProxy::mainloop()
         msgh.msg_iovlen = 1;
         msgh.msg_name = (struct sockaddr*)&i->second.remote;
         msgh.msg_namelen = i->second.remote.getSocklen();
-        msgh.msg_control=nullptr;
+        msgh.msg_control = nullptr;
 
-        if(i->second.anyLocal) {
+        if (i->second.anyLocal) {
           addCMsgSrcAddr(&msgh, &cbuf, i->second.anyLocal.get_ptr(), 0);
         }
-        if(sendmsg(i->second.outsock, &msgh, 0) < 0) {
+        if (sendmsg(i->second.outsock, &msgh, 0) < 0) {
           int err = errno;
-          g_log<<Logger::Warning<<"dnsproxy.cc: Error sending reply with sendmsg (socket="<<i->second.outsock<<"): "<<stringerror(err)<<endl;
+          g_log << Logger::Warning << "dnsproxy.cc: Error sending reply with sendmsg (socket=" << i->second.outsock << "): " << stringerror(err) << endl;
         }
-        i->second.created=0;
+        i->second.created = 0;
       }
     }
   }
-  catch(PDNSException &ae) {
-    g_log<<Logger::Error<<"Fatal error in DNS proxy: "<<ae.reason<<endl;
+  catch (PDNSException& ae) {
+    g_log << Logger::Error << "Fatal error in DNS proxy: " << ae.reason << endl;
   }
-  catch(std::exception &e) {
-    g_log<<Logger::Error<<"Communicator thread died because of STL error: "<<e.what()<<endl;
+  catch (std::exception& e) {
+    g_log << Logger::Error << "Communicator thread died because of STL error: " << e.what() << endl;
   }
-  catch( ... )
-  {
+  catch (...) {
     g_log << Logger::Error << "Caught unknown exception." << endl;
   }
-  g_log<<Logger::Error<<"Exiting because DNS proxy failed"<<endl;
+  g_log << Logger::Error << "Exiting because DNS proxy failed" << endl;
   _exit(1);
 }
 
-DNSProxy::~DNSProxy() {
-  if (d_sock>-1) {
+DNSProxy::~DNSProxy()
+{
+  if (d_sock > -1) {
     try {
       closesocket(d_sock);
     }
-    catch(const PDNSException& e) {
+    catch (const PDNSException& e) {
     }
   }
 
-  d_sock=-1;
+  d_sock = -1;
 }
index 1a2ff00b9afbad654d2071705cabd0fde9d89ed2..ccf71a17f64f29bade2f338110036ffdbb148d8b 100644 (file)
@@ -38,7 +38,7 @@ This is a thread that just throws packets around. Should handle ~1000 packets/se
 
 Consists of a thread receiving packets back from the backend and retransmitting them to the original client.
 
-Furthermore, it provides a member function that reports the packet to the connection tracker and actually sends it out. 
+Furthermore, it provides a member function that reports the packet to the connection tracker and actually sends it out.
 
 The sending happens from a source port that is determined by the constructor, but IS random. Furthermore, the ID is XOR-ed with a random value
 to make sure outside parties can't spoof us.
@@ -49,12 +49,12 @@ To fix: how to remove the stale entries that will surely accumulate
 class DNSProxy
 {
 public:
-  DNSProxy(const string &ip); //!< creates socket
+  DNSProxy(const stringip); //!< creates socket
   ~DNSProxy(); //<! dtor for DNSProxy
   void go(); //!< launches the actual thread
-  bool completePacket(std::unique_ptr<DNSPacket>& r, const DNSName& target,const DNSName& aname, const uint8_t scopeMask);
+  bool completePacket(std::unique_ptr<DNSPacket>& r, const DNSName& target, const DNSName& aname, const uint8_t scopeMask);
 
-  void mainloop();                  //!< this is the main loop that receives reply packets and sends them out again
+  void mainloop(); //!< this is the main loop that receives reply packets and sends them out again
 private:
   struct ConntrackEntry
   {
@@ -70,7 +70,7 @@ private:
     int outsock;
   };
 
-  typedef map<int,ConntrackEntry> map_t;
+  typedef map<int, ConntrackEntry> map_t;
 
   // Data
   ComboAddress d_remote;
index a85fe02690924f7e5bd8a40e391691f6b5ea0d34..a174d1aed8652dcb18e0b0d910482745988819bf 100644 (file)
 #include "ednssubnet.hh"
 #include "dns.hh"
 
-namespace {
-        struct EDNSSubnetOptsWire
-        {
-                uint16_t family;
-                uint8_t sourceMask;
-                uint8_t scopeMask;
-        } GCCPACKATTRIBUTE;  // BRRRRR
+namespace
+{
+struct EDNSSubnetOptsWire
+{
+  uint16_t family;
+  uint8_t sourceMask;
+  uint8_t scopeMask;
+} GCCPACKATTRIBUTE; // BRRRRR
 
 }
 
 bool getEDNSSubnetOptsFromString(const string& options, EDNSSubnetOpts* eso)
 {
-  //cerr<<"options.size:"<<options.size()<<endl;
+  // cerr<<"options.size:"<<options.size()<<endl;
   return getEDNSSubnetOptsFromString(options.c_str(), options.length(), eso);
 }
 bool getEDNSSubnetOptsFromString(const char* options, unsigned int len, EDNSSubnetOpts* eso)
 {
   EDNSSubnetOptsWire esow;
-  static_assert (sizeof(esow) == 4, "sizeof(EDNSSubnetOptsWire) must be 4 bytes");
-  if(len < sizeof(esow))
+  static_assert(sizeof(esow) == 4, "sizeof(EDNSSubnetOptsWire) must be 4 bytes");
+  if (len < sizeof(esow))
     return false;
   memcpy(&esow, options, sizeof(esow));
   esow.family = ntohs(esow.family);
-  //cerr<<"Family when parsing from string: "<<esow.family<<endl;
+  // cerr<<"Family when parsing from string: "<<esow.family<<endl;
   ComboAddress address;
-  unsigned int octetsin = esow.sourceMask > 0 ? (((esow.sourceMask - 1)>> 3)+1) : 0;
-  //cerr<<"octetsin:"<<octetsin<<endl;
-  if(esow.family == 1) {
-    if(len != sizeof(esow)+octetsin)
+  unsigned int octetsin = esow.sourceMask > 0 ? (((esow.sourceMask - 1) >> 3) + 1) : 0;
+  // cerr<<"octetsin:"<<octetsin<<endl;
+  if (esow.family == 1) {
+    if (len != sizeof(esow) + octetsin)
       return false;
-    if(octetsin > sizeof(address.sin4.sin_addr.s_addr))
+    if (octetsin > sizeof(address.sin4.sin_addr.s_addr))
       return false;
     address.reset();
     address.sin4.sin_family = AF_INET;
-    if(octetsin > 0)
-      memcpy(&address.sin4.sin_addr.s_addr, options+sizeof(esow), octetsin);
-  } else if(esow.family == 2) {
-    if(len != sizeof(esow)+octetsin)
+    if (octetsin > 0)
+      memcpy(&address.sin4.sin_addr.s_addr, options + sizeof(esow), octetsin);
+  }
+  else if (esow.family == 2) {
+    if (len != sizeof(esow) + octetsin)
       return false;
-    if(octetsin > sizeof(address.sin6.sin6_addr.s6_addr))
+    if (octetsin > sizeof(address.sin6.sin6_addr.s6_addr))
       return false;
 
     address.reset();
     address.sin4.sin_family = AF_INET6;
-    if(octetsin > 0)
-      memcpy(&address.sin6.sin6_addr.s6_addr, options+sizeof(esow), octetsin);
+    if (octetsin > 0)
+      memcpy(&address.sin6.sin6_addr.s6_addr, options + sizeof(esow), octetsin);
   }
   else
     return false;
   eso->source = Netmask(address, esow.sourceMask);
   /* 'address' has more bits set (potentially) than scopeMask. This leads to odd looking netmasks that promise
      more precision than they have. For this reason we truncate the address to scopeMask bits */
-  
+
   address.truncate(esow.scopeMask); // truncate will not throw for odd scopeMasks
   eso->scope = Netmask(address, esow.scopeMask);
 
@@ -93,15 +95,14 @@ string makeEDNSSubnetOptsString(const EDNSSubnetOpts& eso)
   esow.sourceMask = eso.source.getBits();
   esow.scopeMask = eso.scope.getBits();
   ret.assign((const char*)&esow, sizeof(esow));
-  int octetsout = ((esow.sourceMask - 1)>> 3)+1;
+  int octetsout = ((esow.sourceMask - 1) >> 3) + 1;
 
-  ComboAddress src=eso.source.getNetwork();
+  ComboAddress src = eso.source.getNetwork();
   src.truncate(esow.sourceMask);
 
-  if(family == htons(1)) 
-    ret.append((const char*) &src.sin4.sin_addr.s_addr, octetsout);
+  if (family == htons(1))
+    ret.append((const char*)&src.sin4.sin_addr.s_addr, octetsout);
   else
-    ret.append((const char*) &src.sin6.sin6_addr.s6_addr, octetsout);
+    ret.append((const char*)&src.sin6.sin6_addr.s6_addr, octetsout);
   return ret;
 }
-
index b0f6e485bf70aa24dbabef4c5cc604e0e8d5c8f2..19beb03186196309fa71fae0e843f19a9afdf043 100644 (file)
@@ -26,8 +26,8 @@
 
 struct EDNSSubnetOpts
 {
-       Netmask source;
-       Netmask scope;
+  Netmask source;
+  Netmask scope;
 };
 
 bool getEDNSSubnetOptsFromString(const string& options, EDNSSubnetOpts* eso);
index a8dc38e4a3bfc3682a95aadde5bdb18c0b54cb66..f6f12c6c756fc1fca0ebda8f6069bb49842b53a4 100644 (file)
@@ -39,7 +39,7 @@ static string logPrefix = "[stub-resolver] ";
 bool resolversDefined()
 {
   if (s_resolversForStub.read_lock()->empty()) {
-    g_log<<Logger::Warning<<logPrefix<<"No upstream resolvers configured, stub resolving (including secpoll and ALIAS) impossible."<<endl;
+    g_log << Logger::Warning << logPrefix << "No upstream resolvers configured, stub resolving (including secpoll and ALIAS) impossible." << endl;
     return false;
   }
   return true;
@@ -72,12 +72,11 @@ static void parseLocalResolvConf()
 {
   const time_t now = time(nullptr);
   if ((s_localResolvConfLastCheck + LOCAL_RESOLV_CONF_MAX_CHECK_INTERVAL) > now)
-    return ;
+    return;
 
   parseLocalResolvConf_locked(*(s_resolversForStub.write_lock()), now);
 }
 
-
 /*
  * Fill the s_resolversForStub vector with addresses for the upstream resolvers.
  * First, parse the `resolver` configuration option for IP addresses to use.
@@ -88,7 +87,7 @@ static void parseLocalResolvConf()
  */
 void stubParseResolveConf()
 {
-  if(::arg().mustDo("resolver")) {
+  if (::arg().mustDo("resolver")) {
     auto resolversForStub = s_resolversForStub.write_lock();
     vector<string> parts;
     stringtok(parts, ::arg()["resolver"], " ,\t");
@@ -113,7 +112,7 @@ int stubDoResolve(const DNSName& qname, uint16_t qtype, vector<DNSZoneRecord>& r
   }
   // only check if resolvers come from local resolv.conf in the first place
   if (s_localResolvConfMtime != 0) {
-        parseLocalResolvConf();
+    parseLocalResolvConf();
   }
   if (!resolversDefined())
     return RCode::ServFail;
@@ -122,11 +121,10 @@ int stubDoResolve(const DNSName& qname, uint16_t qtype, vector<DNSZoneRecord>& r
   vector<uint8_t> packet;
 
   DNSPacketWriter pw(packet, qname, qtype);
-  pw.getHeader()->id=dns_random_uint16();
-  pw.getHeader()->rd=1;
-  
-  if (d_eso != nullptr)
-  {
+  pw.getHeader()->id = dns_random_uint16();
+  pw.getHeader()->rd = 1;
+
+  if (d_eso != nullptr) {
     // pass along EDNS subnet from client if given - issue #5469
     string origECSOptionStr = makeEDNSSubnetOptsString(*d_eso);
     DNSPacketWriter::optvect_t opts;
@@ -136,13 +134,13 @@ int stubDoResolve(const DNSName& qname, uint16_t qtype, vector<DNSZoneRecord>& r
   }
 
   string queryNameType = qname.toString() + "|" + QType(qtype).toString();
-  string msg ="Doing stub resolving for '" + queryNameType + "', using resolvers: ";
+  string msg = "Doing stub resolving for '" + queryNameType + "', using resolvers: ";
   for (const auto& server : *resolversForStub) {
     msg += server.toString() + ", ";
   }
-  g_log<<Logger::Debug<<logPrefix<<msg.substr(0, msg.length() - 2)<<endl;
+  g_log << Logger::Debug << logPrefix << msg.substr(0, msg.length() - 2) << endl;
 
-  for(const ComboAddress& dest : *resolversForStub) {
+  for (const ComboAddress& dest : *resolversForStub) {
     Socket sock(dest.sin4.sin_family, SOCK_DGRAM);
     sock.setNonBlocking();
     sock.connect(dest);
@@ -155,38 +153,39 @@ int stubDoResolve(const DNSName& qname, uint16_t qtype, vector<DNSZoneRecord>& r
     try {
     retry:
       sock.read(reply); // this calls recv
-      if(reply.size() > sizeof(struct dnsheader)) {
+      if (reply.size() > sizeof(struct dnsheader)) {
         struct dnsheader d;
         memcpy(&d, reply.c_str(), sizeof(d));
-        if(d.id != pw.getHeader()->id)
+        if (d.id != pw.getHeader()->id)
           goto retry;
       }
     }
-    catch(...) {
+    catch (...) {
       continue;
     }
     MOADNSParser mdp(false, reply);
-    if(mdp.d_header.rcode == RCode::ServFail)
+    if (mdp.d_header.rcode == RCode::ServFail)
       continue;
 
-    for(const auto & answer : mdp.d_answers) {
-      if(answer.first.d_place == 1 && answer.first.d_type==qtype) {
+    for (const auto& answer : mdp.d_answers) {
+      if (answer.first.d_place == 1 && answer.first.d_type == qtype) {
         DNSZoneRecord zrr;
         zrr.dr = answer.first;
-        zrr.auth=true;
+        zrr.auth = true;
         ret.push_back(zrr);
       }
     }
-    g_log<<Logger::Debug<<logPrefix<<"Question for '"<<queryNameType<<"' got answered by "<<dest.toString()<<endl;
+    g_log << Logger::Debug << logPrefix << "Question for '" << queryNameType << "' got answered by " << dest.toString() << endl;
     return mdp.d_header.rcode;
   }
   return RCode::ServFail;
 }
 
-int stubDoResolve(const DNSName& qname, uint16_t qtype, vector<DNSRecord>& ret, const EDNSSubnetOpts* d_eso) {
+int stubDoResolve(const DNSName& qname, uint16_t qtype, vector<DNSRecord>& ret, const EDNSSubnetOpts* d_eso)
+{
   vector<DNSZoneRecord> ret2;
   int res = stubDoResolve(qname, qtype, ret2, d_eso);
-  for (const auto &r : ret2) {
+  for (const autor : ret2) {
     ret.push_back(r.dr);
   }
   return res;