]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
Correctly store unknown records, fixes #2382
authorAki Tuomi <cmouse@cmouse.fi>
Sun, 29 Mar 2015 20:06:22 +0000 (23:06 +0300)
committerAki Tuomi <cmouse@desteem.org>
Tue, 7 Apr 2015 19:03:45 +0000 (22:03 +0300)
pdns/dnsparser.cc

index e2f367a5a3c1afb9783df0cbca5a695f70bae410..77105d10bf14cf2f84f6fd7478fb7b0cb44cc102 100644 (file)
@@ -42,7 +42,24 @@ public:
 
   UnknownRecordContent(const string& zone) : DNSRecordContent(0)
   {
-    d_record.insert(d_record.end(), zone.begin(), zone.end());
+    // parse the input
+    vector<string> parts;
+    stringtok(parts, zone);
+    if(parts.size()!=3 && !(parts.size()==2 && equals(parts[1],"0")) )
+      throw MOADNSException("Unknown record was stored incorrectly, need 3 fields, got "+lexical_cast<string>(parts.size())+": "+zone );
+    const string& relevant=(parts.size() > 2) ? parts[2] : "";
+    unsigned int total=atoi(parts[1].c_str());
+    if(relevant.size()!=2*total)
+      throw MOADNSException((boost::format("invalid unknown record length for label %s: size not equal to length field (%d != %d)") % d_dr.d_label.c_str() % relevant.size() % (2*total)).str());
+    string out;
+    out.reserve(total+1);
+    for(unsigned int n=0; n < total; ++n) {
+      int c;
+      sscanf(relevant.c_str()+2*n, "%02x", &c);
+      out.append(1, (char)c);
+    }
+
+    d_record.insert(d_record.end(), out.begin(), out.end());
   }
   
   string getZoneRepresentation() const
@@ -59,23 +76,7 @@ public:
   
   void toPacket(DNSPacketWriter& pw)
   {
-    string tmp((char*)&*d_record.begin(), d_record.size());
-    vector<string> parts;
-    stringtok(parts, tmp);
-    if(parts.size()!=3 && !(parts.size()==2 && equals(parts[1],"0")) )
-      throw MOADNSException("Unknown record was stored incorrectly, need 3 fields, got "+lexical_cast<string>(parts.size())+": "+tmp );
-    const string& relevant=(parts.size() > 2) ? parts[2] : "";
-    unsigned int total=atoi(parts[1].c_str());
-    if(relevant.size()!=2*total)
-      throw MOADNSException((boost::format("invalid unknown record length for label %s: size not equal to length field (%d != %d)") % d_dr.d_label.c_str() % relevant.size() % (2*total)).str());
-    string out;
-    out.reserve(total+1);
-    for(unsigned int n=0; n < total; ++n) {
-      int c;
-      sscanf(relevant.c_str()+2*n, "%02x", &c);
-      out.append(1, (char)c);
-    }
-    pw.xfrBlob(out);
+    pw.xfrBlob(string(d_record.begin(),d_record.end()));
   }
 private:
   DNSRecord d_dr;