From: Aki Tuomi Date: Sun, 29 Mar 2015 20:06:22 +0000 (+0300) Subject: Correctly store unknown records, fixes #2382 X-Git-Tag: dnsdist-1.0.0-alpha1~248^2~98^2~18^2~5 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=95a61c6fe0fc761d6d20c040928dac6b8c106ace;p=pdns Correctly store unknown records, fixes #2382 --- diff --git a/pdns/dnsparser.cc b/pdns/dnsparser.cc index e2f367a5a..77105d10b 100644 --- a/pdns/dnsparser.cc +++ b/pdns/dnsparser.cc @@ -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 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(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 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(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;