Browse Source

[1839] Fix toWire() for class=ANY and class=NONE cases

Mukund Sivaraman 11 years ago
parent
commit
0b20f8d3da
1 changed files with 17 additions and 3 deletions
  1. 17 3
      src/lib/dns/rrset.cc

+ 17 - 3
src/lib/dns/rrset.cc

@@ -186,12 +186,26 @@ public:
 // rrsetToWire() above to avoid duplication.
 unsigned int
 BasicRRsetImpl::toWire(AbstractMessageRenderer& renderer, size_t limit) const {
-    unsigned int n = 0;
-
     if (rdatalist_.empty()) {
-        isc_throw(EmptyRRset, "toWire() is attempted for an empty RRset");
+        // empty rrsets are only allowed for classes ANY and NONE
+        if (rrclass_ != RRClass::ANY() &&
+            rrclass_ != RRClass::NONE()) {
+            isc_throw(EmptyRRset, "toWire() is attempted for an empty RRset");
+        }
+
+        // For an empty RRset, write the name, type, class and TTL once,
+        // followed by empty rdata.
+        name_.toWire(renderer);
+        rrtype_.toWire(renderer);
+        rrclass_.toWire(renderer);
+        ttl_.toWire(renderer);
+        renderer.writeUint16(0);
+        // Still counts as 1 'rr'; it does show up in the message
+        return (1);
     }
 
+    unsigned int n = 0;
+
     // sort the set of Rdata based on rrset-order and sortlist, and possible
     // other options.  Details to be considered.
     BOOST_FOREACH(const ConstRdataPtr& rdata, rdatalist_) {