*matchLen=0;
boost::container::static_vector<uint16_t, 34> nvect, pvect;
- for(auto riter= raw.cbegin(); riter < raw.cend(); ) {
- if(!*riter)
- break;
- nvect.push_back(riter - raw.cbegin());
- riter+=*riter+1;
+ try {
+ for(auto riter= raw.cbegin(); riter < raw.cend(); ) {
+ if(!*riter)
+ break;
+ nvect.push_back(riter - raw.cbegin());
+ riter+=*riter+1;
+ }
+ }
+ catch(std::bad_alloc& ba) {
+ if(l_verbose)
+ cout<<"Domain "<<name<<" too large to compress"<<endl;
+ return 0;
}
if(l_verbose) {
}
// memcmp here makes things _slower_
pvect.clear();
- for(auto iter = d_content.cbegin() + p; iter < d_content.cend();) {
-
- uint8_t c=*iter;
- if(l_verbose)
- cout<<"Found label length: "<<(int)c<<endl;
- if(c & 0xc0) {
-
- uint16_t npos = 0x100*(c & (~0xc0)) + *++iter;
- iter = d_content.begin() + npos;
+ try {
+ for(auto iter = d_content.cbegin() + p; iter < d_content.cend();) {
+ uint8_t c=*iter;
if(l_verbose)
- cout<<"Is compressed label to newpos "<<npos<<", going there"<<endl;
- // check against going forward here
- continue;
+ cout<<"Found label length: "<<(int)c<<endl;
+ if(c & 0xc0) {
+ uint16_t npos = 0x100*(c & (~0xc0)) + *++iter;
+ iter = d_content.begin() + npos;
+ if(l_verbose)
+ cout<<"Is compressed label to newpos "<<npos<<", going there"<<endl;
+ // check against going forward here
+ continue;
+ }
+ if(!c)
+ break;
+ pvect.push_back(iter - d_content.cbegin());
+ iter+=*iter+1;
}
- if(!c)
- break;
- pvect.push_back(iter - d_content.cbegin());
- iter+=*iter+1;
+ }
+ catch(std::bad_alloc& ba) {
+ if(l_verbose)
+ cout<<"Domain "<<name<<" too large to compress"<<endl;
+ continue;
}
if(l_verbose) {
cout<<"Packet vector: "<<endl;
}
return bestpos;
}
-
// this is the absolute hottest function in the pdns recursor
void DNSPacketWriter::xfrName(const DNSName& name, bool compress, bool)
{
}
+BOOST_AUTO_TEST_CASE(test_packetCompressLong) {
+ reportBasicTypes();
+ vector<unsigned char> packet;
+ DNSName loopback("1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa");
+ DNSPacketWriter dpw(packet, loopback, QType::PTR);
+
+ dpw.startRecord(loopback, QType::PTR);
+ PTRRecordContent prc(DNSName("localhost"));
+ prc.toPacket(dpw);
+ dpw.commit();
+ DNSName roundtrip((char*)&packet[0], packet.size(), 12, false);
+ BOOST_CHECK_EQUAL(loopback,roundtrip);
+
+ packet.clear();
+ DNSName longer("1.2.3.4.5.6.7.8.1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa");
+ DNSPacketWriter dpw2(packet, longer, QType::PTR);
+
+ dpw2.startRecord(DNSName("a.b.c.d.e")+longer, QType::PTR);
+ PTRRecordContent prc2(DNSName("localhost"));
+ prc2.toPacket(dpw2);
+ dpw2.commit();
+
+}
+