pw.xfrBlob(string(d_record.begin(),d_record.end()));
}
-shared_ptr<DNSRecordContent> DNSRecordContent::deserialize(const DNSName& qname, uint16_t qtype, const string& serialized, uint16_t qclass, bool trusted)
+shared_ptr<DNSRecordContent> DNSRecordContent::deserialize(const DNSName& qname, uint16_t qtype, const string& serialized, uint16_t qclass, bool internalRepresentation)
{
dnsheader dnsheader;
memset(&dnsheader, 0, sizeof(dnsheader));
dr.d_type = qtype;
dr.d_name = qname;
dr.d_clen = serialized.size();
- PacketReader pr(std::string_view(reinterpret_cast<const char*>(packet.data()), packet.size()), packet.size() - serialized.size() - sizeof(dnsrecordheader), trusted);
+ // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast): packet.data() is uint8_t *
+ PacketReader reader(std::string_view(reinterpret_cast<const char*>(packet.data()), packet.size()), packet.size() - serialized.size() - sizeof(dnsrecordheader), internalRepresentation);
/* needed to get the record boundaries right */
- pr.getDnsrecordheader(drh);
- auto content = DNSRecordContent::make(dr, pr, Opcode::Query);
+ reader.getDnsrecordheader(drh);
+ auto content = DNSRecordContent::make(dr, reader, Opcode::Query);
return content;
}
xfrCAWithoutPort(key, addr);
addresses.push_back(addr);
}
- // If there were no addresses, and the input comes from a trusted source,
- // we can reasonably suppose this is the serialization of "auto".
- bool doAuto{d_trusted && len == 0};
+ // If there were no addresses, and the input comes from internal
+ // representation, we can reasonably assume this is the serialization
+ // of "auto".
+ bool doAuto{d_internal && len == 0};
auto param = SvcParam(key, std::move(addresses));
param.setAutoHint(doAuto);
kvs.insert(param);
class PacketReader
{
public:
- PacketReader(const std::string_view& content, uint16_t initialPos=sizeof(dnsheader), bool trusted = false)
- : d_pos(initialPos), d_startrecordpos(initialPos), d_content(content), d_trusted(trusted)
+ PacketReader(const std::string_view& content, uint16_t initialPos=sizeof(dnsheader), bool internalRepresentation = false)
+ : d_pos(initialPos), d_startrecordpos(initialPos), d_content(content), d_internal(internalRepresentation)
{
if(content.size() > std::numeric_limits<uint16_t>::max())
throw std::out_of_range("packet too large");
uint16_t d_recordlen; // ditto
uint16_t not_used; // Aligns the whole class on 8-byte boundaries
const std::string_view d_content;
- bool d_trusted;
+ bool d_internal;
};
struct DNSRecord;
return typeid(*this)==typeid(rhs) && this->getZoneRepresentation() == rhs.getZoneRepresentation();
}
- // parse the content in wire format, possibly including compressed pointers pointing to the owner name
- static shared_ptr<DNSRecordContent> deserialize(const DNSName& qname, uint16_t qtype, const string& serialized, uint16_t qclass=QClass::IN, bool trusted = false);
+ // parse the content in wire format, possibly including compressed pointers pointing to the owner name.
+ // internalRepresentation is set when the data comes from an internal source,
+ // such as the LMDB backend.
+ static shared_ptr<DNSRecordContent> deserialize(const DNSName& qname, uint16_t qtype, const string& serialized, uint16_t qclass=QClass::IN, bool internalRepresentation = false);
void doRecordCheck(const struct DNSRecord&){}