// this should be the __only__ dns name parser in PowerDNS.
void DNSName::packetParser(const char* pos, int len, int offset, bool uncompress, uint16_t* qtype, uint16_t* qclass, unsigned int* consumed)
{
- bool labelAdded = false;
unsigned char labellen;
const char *opos = pos;
pos += offset;
labellen &= (~0xc0);
int newpos = (labellen << 8) + *(const unsigned char*)pos;
- if(newpos < len)
- packetParser(opos, len, newpos, labelAdded);
+ if(newpos < offset)
+ packetParser(opos, len, newpos, true);
else
- throw std::range_error("Found an invalid compression pointer");
+ throw std::range_error("Found a forward reference during label decompression");
pos++;
break;
}
if (pos + labellen < end) {
- labelAdded = true;
appendRawLabel(string(pos, labellen));
}
else
BOOST_CHECK_EQUAL(dn.toString(), "www.example.com.");
}
+BOOST_AUTO_TEST_CASE(test_pointer_pointer_root) { // Pointer to pointer to root
+
+ string name("\x00""\xc0""\x00""\x03""com\xc0""\x01",9);
+
+ DNSName dn(name.c_str(), name.size(), 3, true);
+ BOOST_CHECK_EQUAL(dn.toString(), "com.");
+}
+
BOOST_AUTO_TEST_CASE(test_bad_compression_pointer) { // Pointing beyond packet boundary
std::string name("\x03""com\x00""\x07""example\xc0""\x11""xc0""\x00", 17);