]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
Clarify which types are supported, implemented, meta, etc
authorRemi Gacogne <remi.gacogne@powerdns.com>
Fri, 12 May 2023 10:53:00 +0000 (12:53 +0200)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Mon, 3 Jul 2023 08:56:11 +0000 (10:56 +0200)
pdns/backends/gsql/gsqlbackend.cc
pdns/dnsparser.cc
pdns/dnsparser.hh
pdns/qtype.cc
pdns/qtype.hh
pdns/rfc2136handler.cc

index ead6243d68fa74e3299d415ab4af7bc5a47c4d4a..4143f99dfe30ad11c789d049415a7f0ccc42f68a 100644 (file)
@@ -2156,7 +2156,7 @@ void GSQLBackend::extractRecord(SSqlStatement::row_t& row, DNSResourceRecord& r)
 
   r.qtype=row[3];
 
-  if (d_upgradeContent && DNSRecordContent::isUnknownType(row[3]) && r.qtype.isSupportedType()) {
+  if (d_upgradeContent && DNSRecordContent::isUnknownType(row[3]) && r.qtype.isSupportedType() && !r.qtype.isMetadataType() && DNSRecordContent::isRegisteredType(r.qtype, r.qclass) && r.qtype != QType::NSEC && r.qtype != QType::NSEC3 && r.qtype != QType::ANY) {
     r.content = DNSRecordContent::upgradeContent(r.qname, r.qtype, row[0]);
   }
   else if (r.qtype==QType::MX || r.qtype==QType::SRV) {
index 7f755793cedd4dba2e4c33983ab687a398cc991f..b7c6a9bbe768badb3b66c8daaebf8bfbb676a397 100644 (file)
@@ -195,6 +195,11 @@ DNSRecordContent::zmakermap_t& DNSRecordContent::getZmakermap()
   return zmakermap;
 }
 
+bool DNSRecordContent::isRegisteredType(uint16_t rtype, uint16_t rclass)
+{
+  return getTypemap().count(pair(rclass, rtype)) != 0;
+}
+
 DNSRecord::DNSRecord(const DNSResourceRecord& rr): d_name(rr.qname)
 {
   d_type = rr.qtype.getCode();
index 4b22a7ac7c515e622fbcc790ae2065b17d073ae0..014087ef35ab9aca79b682be78c82cb72c30ca84 100644 (file)
@@ -268,7 +268,7 @@ public:
     throw runtime_error("Unknown DNS type '"+name+"'");
   }
 
-  static const string NumberToType(uint16_t num, uint16_t classnum=1)
+  static const string NumberToType(uint16_t num, uint16_t classnum = QClass::IN)
   {
     auto iter = getT2Namemap().find(pair(classnum, num));
     if(iter == getT2Namemap().end())
@@ -277,6 +277,11 @@ public:
     return iter->second;
   }
 
+  /**
+   * \brief Return whether we have implemented a content representation for this type
+   */
+  static bool isRegisteredType(uint16_t rtype, uint16_t rclass = QClass::IN);
+
   virtual uint16_t getType() const = 0;
 
 protected:
index f8069f8696d51800e1bd789785b6f6dc213519bc..a0d5732cd10ea4363c198d55974ea06e546d31e2 100644 (file)
@@ -119,13 +119,10 @@ bool QType::isSupportedType() const
 
 bool QType::isMetadataType() const
 {
-  if (code == QType::AXFR ||
-      code == QType::MAILA ||
-      code == QType::MAILB ||
-      code == QType::TSIG ||
-      code == QType::IXFR)
+  // rfc6895 section 3.1, note ANY is 255 and falls outside the range
+  if (code == QType::OPT || (code >= rfc6895MetaLowerBound && code <= rfc6895MetaUpperBound)) {
     return true;
-
+  }
   return false;
 }
 
index e66dbefff5ee7b1634b2abd4b74057a05294963e..f5a879bef8f56c60223c3538347d17c7df39dbfb 100644 (file)
@@ -57,7 +57,18 @@ public:
     return code;
   }
 
+  /**
+   * \brief Return whether we know the name of this type.
+   *
+   * This does not presume that we have an implemented a content representation for this type,
+   * for that please see DNSRecordContent::isRegisteredType().
+   */
   bool isSupportedType() const;
+  /**
+   * \brief Whether the type is either a QTYPE or Meta-Type as defined by rfc6895 section 3.1.
+   *
+   * Note that ANY is 255 and falls outside the range.
+   */
   bool isMetadataType() const;
 
   static uint16_t chartocode(const char* p);
index ceeb2d3c6fd5c1e3b0b1df312285357e6b1e94c4..2f993bfa4a44109430ca990aa68d014e23f30675 100644 (file)
@@ -68,25 +68,31 @@ int PacketHandler::checkUpdatePrerequisites(const DNSRecord *rr, DomainInfo *di)
 // Method implements section 3.4.1 of RFC2136
 int PacketHandler::checkUpdatePrescan(const DNSRecord *rr) {
   // The RFC stats that d_class != ZCLASS, but we only support the IN class.
-  if (rr->d_class != QClass::IN && rr->d_class != QClass::NONE && rr->d_class != QClass::ANY)
+  if (rr->d_class != QClass::IN && rr->d_class != QClass::NONE && rr->d_class != QClass::ANY) {
     return RCode::FormErr;
+  }
 
   QType qtype = QType(rr->d_type);
 
-  if (! qtype.isSupportedType())
+  if (!qtype.isSupportedType()) {
     return RCode::FormErr;
+  }
 
-  if ((rr->d_class == QClass::NONE || rr->d_class == QClass::ANY) && rr->d_ttl != 0)
+  if ((rr->d_class == QClass::NONE || rr->d_class == QClass::ANY) && rr->d_ttl != 0) {
     return RCode::FormErr;
+  }
 
-  if (rr->d_class == QClass::ANY && rr->d_clen != 0)
+  if (rr->d_class == QClass::ANY && rr->d_clen != 0) {
     return RCode::FormErr;
+  }
 
-  if (qtype.isMetadataType())
-      return RCode::FormErr;
+  if (qtype.isMetadataType()) {
+    return RCode::FormErr;
+  }
 
-  if (rr->d_class != QClass::ANY && qtype.getCode() == QType::ANY)
+  if (rr->d_class != QClass::ANY && qtype.getCode() == QType::ANY) {
     return RCode::FormErr;
+  }
 
   return RCode::NoError;
 }