size_t DNSName::parsePacketUncompressed(const pdns::views::UnsignedCharView& view, size_t pos, bool uncompress)
{
const size_t initialPos = pos;
+ const size_t neededSizeForFinalLabel = /* final empty label length */ (d_storage.empty() ? 1U : 0U);
size_t totalLength = 0;
unsigned char labellen = 0;
throw std::range_error("Found an invalid label length in qname (only one of the first two bits is set)");
}
checkLabelLength(labellen);
- // reserve one byte for the label length
- if (totalLength + labellen > s_maxDNSNameLength - 1) {
+ // reserve one byte for the label length, plus one byte for the final empty label if we were empty before
+ if (totalLength + labellen > s_maxDNSNameLength - (neededSizeForFinalLabel + 1)) {
throw std::range_error("name too long to append");
}
if (pos + labellen >= view.size()) {
BOOST_CHECK_THROW(DNSName dn(name.c_str(), name.size(), 0, true), std::range_error);
}
+BOOST_AUTO_TEST_CASE(test_name_length_too_long_from_wire) {
+
+ string name("\x03""www""\x03""www""\x03""www""\x03""www""\x03""www""\x03""www""\x03""www""\x03""www""\x03""www""\x03""www""\x03""www""\x03""www""\x03""www""\x03""www""\x03""www""\x03""www""\x03""www""\x03""www""\x03""www""\x03""www""\x03""www""\x03""www""\x03""www""\x03""www""\x03""www""\x03""www""\x03""www""\x03""www""\x03""www""\x03""www""\x03""www""\x03""www""\x03""www""\x03""www""\x03""www""\x03""www""\x03""www""\x03""www""\x03""www""\x03""www""\x03""www""\x03""www""\x03""www""\x03""www""\x03""www""\x03""www""\x03""www""\x03""www""\x03""www""\x03""www""\x03""www""\x03""www""\x03""www""\x03""www""\x03""www""\x03""www""\x03""www""\x03""www""\x03""www""\x03""www""\x05""stats""\x05""stats""\x02""fr""\x00", 256);
+ BOOST_CHECK_THROW(DNSName dn(name.c_str(), name.size(), 0, true), std::range_error);
+}
+
BOOST_AUTO_TEST_CASE(test_compression) { // Compression test
string name("\x03""com\x00""\x07""example\xc0""\x00""\x03""www\xc0""\x05", 21);