]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
Require explicit zone id values in lookup calls.
authorMiod Vallat <miod.vallat@powerdns.com>
Fri, 25 Apr 2025 05:46:22 +0000 (07:46 +0200)
committerMiod Vallat <miod.vallat@powerdns.com>
Mon, 26 May 2025 11:49:12 +0000 (13:49 +0200)
Annotate use of UnknownDomainID when it's safe to use.

docs/appendices/backend-writers-guide.rst
modules/remotebackend/remotebackend.hh
modules/remotebackend/test-remotebackend.cc
pdns/communicator.hh
pdns/dnsbackend.cc
pdns/dnsbackend.hh
pdns/pdnsutil.cc

index 143d5f31222f37dfbde6744f0d1675999fce6724..aa7179470d87a5b7e13025285701725741a04bc9 100644 (file)
@@ -67,7 +67,7 @@ following methods are relevant:
         {
         public:
         virtual unsigned int getCapabilities()=0;
-        virtual void lookup(const QType &qtype, const string &qdomain, domainid_t zoneId=UnknownDomainID, DNSPacket *pkt_p=nullptr)=0;
+        virtual void lookup(const QType &qtype, const string &qdomain, domainid_t zoneId, DNSPacket *pkt_p=nullptr)=0;
         virtual bool list(const string &target, domainid_t domain_id)=0;
         virtual bool get(DNSResourceRecord &r)=0;
         virtual bool getSOA(const string &name, domainid_t zoneId, SOAData &soadata);
@@ -355,7 +355,7 @@ Methods
 * `CAP_DNSSEC`     Backend implements :ref:`backend-dnssec`.
 * `CAP_LIST`       Backend implements `list`, for AXFR or `pdnsutil list-zone`
 
-.. cpp:function:: void DNSBackend::lookup(const QType &qtype, const string &qdomain, domainid_t zoneId=UnknownDomainID, DNSPacket *pkt=nullptr)
+.. cpp:function:: void DNSBackend::lookup(const QType &qtype, const string &qdomain, domainid_t zoneId, DNSPacket *pkt=nullptr)
 
   This function is used to initiate a straight lookup for a record of name
   'qdomain' and type 'qtype'. A QType can be converted into an integer by
index 4e6774093921af2e13d6ea690362f6b34eae91c1..94bb292b420309b33328b3f8848c6695ed2ab8c6 100644 (file)
@@ -168,8 +168,8 @@ public:
   ~RemoteBackend() override;
 
   unsigned int getCapabilities() override;
-  void lookup(const QType& qtype, const DNSName& qdomain, domainid_t zoneId = UnknownDomainID, DNSPacket* pkt_p = nullptr) override;
-  void APILookup(const QType& qtype, const DNSName& qdomain, domainid_t zoneId = UnknownDomainID, bool include_disabled = false) override;
+  void lookup(const QType& qtype, const DNSName& qdomain, domainid_t zoneId, DNSPacket* pkt_p = nullptr) override;
+  void APILookup(const QType& qtype, const DNSName& qdomain, domainid_t zoneId, bool include_disabled = false) override;
   bool get(DNSResourceRecord& rr) override;
   bool list(const ZoneName& target, domainid_t domain_id, bool include_disabled = false) override;
 
index 9589c68e5d2cf8bca5b02c9b58074861cbf906f0..05cd75a90db45e8274735fce508c13347c934f94 100644 (file)
@@ -52,7 +52,7 @@ BOOST_AUTO_TEST_CASE(test_method_lookup)
 {
   BOOST_TEST_MESSAGE("Testing lookup method");
   DNSResourceRecord resourceRecord;
-  backendUnderTest->lookup(QType(QType::SOA), DNSName("unit.test."));
+  backendUnderTest->lookup(QType(QType::SOA), DNSName("unit.test."), UnknownDomainID);
   // then try to get()
   BOOST_CHECK(backendUnderTest->get(resourceRecord)); // and this should be TRUE.
   // then we check rr contains what we expect
@@ -66,7 +66,7 @@ BOOST_AUTO_TEST_CASE(test_method_lookup_empty)
 {
   BOOST_TEST_MESSAGE("Testing lookup method with empty result");
   DNSResourceRecord resourceRecord;
-  backendUnderTest->lookup(QType(QType::SOA), DNSName("empty.unit.test."));
+  backendUnderTest->lookup(QType(QType::SOA), DNSName("empty.unit.test."), UnknownDomainID);
   // then try to get()
   BOOST_CHECK(!backendUnderTest->get(resourceRecord)); // and this should be FALSE
 }
index e95181c1186bd699aeb75ab0abe95a5cf94424c6..f85fb597bc3e7d5361239416843a8d819294faaf 100644 (file)
@@ -263,7 +263,8 @@ public:
     this->resolve_name(&addresses, name);
 
     if (b) {
-      b->lookup(QType(QType::ANY), name, -1);
+      // Safe to pass UnknownDomainID here - name is obtained from NSRecordContent
+      b->lookup(QType(QType::ANY), name, UnknownDomainID);
       DNSZoneRecord rr;
       while (b->get(rr))
         if (rr.dr.d_type == QType::A || rr.dr.d_type == QType::AAAA)
index 5d71833660d72e44948c70fd3117f264713cdeeb..1c0791361baf3899507b7405ec71c31845f012a5 100644 (file)
@@ -260,6 +260,7 @@ bool DNSBackend::getSOA(const ZoneName& domain, domainid_t zoneId, SOAData& soaD
     }
     zoneId = domaininfo.id;
   }
+  // Safe for zoneId to be -1 here - it won't be the case for variants, see above
   this->lookup(QType(QType::SOA), domain.operator const DNSName&(), zoneId);
   S.inc("backend-queries");
 
index e445c96ef9ea039d10008fe420dd1e6b3bb24f75..b6ca22d37f393774f2d3b58e454902b00f8e107d 100644 (file)
@@ -169,8 +169,8 @@ public:
   virtual unsigned int getCapabilities() = 0;
 
   //! lookup() initiates a lookup. A lookup without results should not throw!
-  virtual void lookup(const QType& qtype, const DNSName& qdomain, domainid_t zoneId = UnknownDomainID, DNSPacket* pkt_p = nullptr) = 0;
-  virtual void APILookup(const QType& qtype, const DNSName& qdomain, domainid_t zoneId = UnknownDomainID, bool include_disabled = false);
+  virtual void lookup(const QType& qtype, const DNSName& qdomain, domainid_t zoneId, DNSPacket* pkt_p = nullptr) = 0;
+  virtual void APILookup(const QType& qtype, const DNSName& qdomain, domainid_t zoneId, bool include_disabled = false);
   virtual bool get(DNSResourceRecord&) = 0; //!< retrieves one DNSResource record, returns false if no more were available
   virtual bool get(DNSZoneRecord& zoneRecord);
 
index c16862105beac52ac05f171762e5298429f41929..2659a2e8a46e8440b780ac3c9c017e5c0352adf7 100644 (file)
@@ -253,11 +253,13 @@ static void dbBench(const std::string& fname)
   unsigned int hits=0, misses=0;
   for(; n < 10000; ++n) {
     DNSName domain(domains[dns_random(domains.size())]);
-    B.lookup(QType(QType::NS), domain, -1);
+    // Safe to pass UnknownDomainID here
+    B.lookup(QType(QType::NS), domain, UnknownDomainID);
     while(B.get(rr)) {
       hits++;
     }
-    B.lookup(QType(QType::A), DNSName(std::to_string(dns_random_uint32()))+domain, -1);
+    // Safe to pass UnknownDomainID here
+    B.lookup(QType(QType::A), DNSName(std::to_string(dns_random_uint32()))+domain, UnknownDomainID);
     while(B.get(rr)) {
     }
     misses++;