Unsure if we can actually get a bad serial here, but we are checking
the number of parts so it looks like it might happen.
stringtok(parts, res[0].content);
if(parts.size()<3)
throw ResolverException("Query to '" + ipport + "' for SOA of '" + domain.toString() + "' produced an unparseable response");
-
- *serial=pdns_stou(parts[2]);
+
+ try {
+ *serial=pdns_stou(parts[2]);
+ }
+ catch(const std::out_of_range& oor) {
+ throw ResolverException("Query to '" + ipport + "' for SOA of '" + domain.toString() + "' produced an unparseable serial");
+ }
}
AXFRRetriever::AXFRRetriever(const ComboAddress& remote,
vector<string>parts;
stringtok(parts, rr->d_content->getZoneRepresentation());
if (parts.size() >= 3) {
- serial=pdns_stou(parts[2]);
+ try {
+ serial=pdns_stou(parts[2]);
+ }
+ catch(const std::out_of_range& oor) {
+ L<<Logger::Error<<"Invalid serial in IXFR query"<<endl;
+ outpacket->setRcode(RCode::FormErr);
+ sendPacket(outpacket,outsock);
+ return 0;
+ }
} else {
L<<Logger::Error<<"No serial in IXFR query"<<endl;
outpacket->setRcode(RCode::FormErr);