str<<"\\# "<<(unsigned int)d_record.size()<<" ";
char hex[4];
for(size_t n=0; n<d_record.size(); ++n) {
- snprintf(hex,sizeof(hex)-1, "%02x", d_record.at(n));
+ snprintf(hex, sizeof(hex), "%02x", d_record.at(n));
str << hex;
}
return str.str();
dr.d_content=DNSRecordContent::mastermake(dr, pr, d_header.opcode);
}
- d_answers.push_back(make_pair(dr, pr.getPosition() - sizeof(dnsheader)));
-
/* XXX: XPF records should be allowed after TSIG as soon as the actual XPF option code has been assigned:
if (dr.d_place == DNSResourceRecord::ADDITIONAL && seenTSIG && dr.d_type != QType::XPF)
*/
seenTSIG = true;
d_tsigPos = recordStartPos;
}
+
+ d_answers.push_back(make_pair(std::move(dr), pr.getPosition() - sizeof(dnsheader)));
}
#if 0
else
stop_at = d_recordlen;
+ /* think unsigned overflow */
+ if (stop_at < d_pos) {
+ throw std::out_of_range("getUnquotedText out of record range");
+ }
+
if(stop_at == d_pos)
return "";
void PacketReader::xfrBlob(string& blob)
try
{
- if(d_recordlen && !(d_pos == (d_startrecordpos + d_recordlen)))
+ if(d_recordlen && !(d_pos == (d_startrecordpos + d_recordlen))) {
+ if (d_pos > (d_startrecordpos + d_recordlen)) {
+ throw std::out_of_range("xfrBlob out of record range");
+ }
blob.assign(&d_content.at(d_pos), &d_content.at(d_startrecordpos + d_recordlen - 1 ) + 1);
- else
+ }
+ else {
blob.clear();
+ }
d_pos = d_startrecordpos + d_recordlen;
}
void PacketReader::xfrBlob(string& blob, int length)
{
if(length) {
+ if (length < 0) {
+ throw std::out_of_range("xfrBlob out of range (negative length)");
+ }
+
blob.assign(&d_content.at(d_pos), &d_content.at(d_pos + length - 1 ) + 1 );
-
+
d_pos += length;
}
- else
+ else {
blob.clear();
+ }
}