From: Johan Jatko Date: Tue, 5 Sep 2017 15:59:55 +0000 (+0200) Subject: Handle AFSDB record separately due to record structure. X-Git-Tag: rec-4.1.0-rc1~28^2~2 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=319d6e47e219ec2fb0b829943040457cbb22ff30;p=thirdparty%2Fpdns.git Handle AFSDB record separately due to record structure. Closes #4703. AFSDB records has two elements, , as per RFC1183, and needs special treatment when parsing. --- diff --git a/pdns/zoneparser-tng.cc b/pdns/zoneparser-tng.cc index 9906ef40fc..7b3670df2f 100644 --- a/pdns/zoneparser-tng.cc +++ b/pdns/zoneparser-tng.cc @@ -461,14 +461,32 @@ bool ZoneParserTNG::get(DNSResourceRecord& rr, std::string* comment) case QType::CNAME: case QType::DNAME: case QType::PTR: - case QType::AFSDB: try { rr.content = toCanonic(d_zonename, rr.content).toStringRootDot(); } catch (std::exception &e) { throw PDNSException("Error in record '" + rr.qname.toString() + " " + rr.qtype.getName() + "': " + e.what()); } break; + case QType::AFSDB: + try { + stringtok(recparts, rr.content); + if(recparts.size() == 2) + { + recparts[1]=toCanonic(d_zonename, recparts[1]).toStringRootDot(); + } else { + throw PDNSException("AFSDB record for "+rr.qname.toString()+" invalid"); + } + rr.content.clear(); + for(string::size_type n = 0; n < recparts.size(); ++n) { + if(n) + rr.content.append(1,' '); + rr.content+=recparts[n]; + } + } catch (std::exception &e) { + throw PDNSException("Error in record '" + rr.qname.toString() + " " + rr.qtype.getName() + "': " + e.what()); + } + break; case QType::SOA: stringtok(recparts, rr.content); if(recparts.size() > 7)