template <typename Container> void GenericDNSPacketWriter<Container>::xfr48BitInt(uint64_t val)
{
+ if ((val >> 48) != 0) {
+ throw runtime_error("Value too large to fit in 48 bits");
+ }
std::array<unsigned char, 6> bytes;
uint16_t theLeft = htons((val >> 32)&0xffffU);
uint32_t theRight = htonl(val & 0xffffffffU);
d_content.insert(d_content.end(), val.content, val.content + sizeof(val.content));
}
-template <typename Container> void GenericDNSPacketWriter<Container>::xfr32BitInt(uint32_t val)
+template <typename Container> void GenericDNSPacketWriter<Container>::xfr32BitInt(uint64_t val)
{
- uint32_t rval=htonl(val);
+ if (val > std::numeric_limits<uint32_t>::max()) {
+ throw runtime_error("Value too large to fit in 32 bits");
+ }
+ uint32_t rval=htonl(static_cast<uint32_t>(val));
uint8_t* ptr=reinterpret_cast<uint8_t*>(&rval);
d_content.insert(d_content.end(), ptr, ptr+4);
}
-template <typename Container> void GenericDNSPacketWriter<Container>::xfr16BitInt(uint16_t val)
+template <typename Container> void GenericDNSPacketWriter<Container>::xfr16BitInt(uint64_t val)
{
- uint16_t rval=htons(val);
+ if (val > std::numeric_limits<uint16_t>::max()) {
+ throw runtime_error("Value too large to fit in 16 bits");
+ }
+ uint16_t rval=htons(static_cast<uint16_t>(val));
uint8_t* ptr=reinterpret_cast<uint8_t*>(&rval);
d_content.insert(d_content.end(), ptr, ptr+2);
}
-template <typename Container> void GenericDNSPacketWriter<Container>::xfr8BitInt(uint8_t val)
+template <typename Container> void GenericDNSPacketWriter<Container>::xfr8BitInt(uint64_t val)
{
- d_content.push_back(val);
+ if (val > std::numeric_limits<uint8_t>::max()) {
+ throw runtime_error("Value too large to fit in 8 bits");
+ }
+ d_content.push_back(static_cast<uint8_t>(val));
}
void xfr48BitInt(uint64_t val);
void xfrNodeOrLocatorID(const NodeOrLocatorID& val);
- void xfr32BitInt(uint32_t val);
- void xfr16BitInt(uint16_t val);
+ void xfr32BitInt(uint64_t val);
+ void xfr16BitInt(uint64_t val);
void xfrType(uint16_t val)
{
xfr16BitInt(val);
xfr32BitInt(val);
}
- void xfr8BitInt(uint8_t val);
+ void xfr8BitInt(uint64_t val);
void xfrName(const DNSName& name, bool compress=false);
void xfrText(const string& text, bool multi=false, bool lenField=true);