#endif /* NOD ENABLED */
if (t_protobufServers) {
- pbMessage.addRR(*i, luaconfsLocal->protobufExportConfig.exportTypes, udr);
+ // Max size is 64k, but we're conservative here, as other fields are added after the answers have been added
+ // If a single answer causes a too big protobuf message, it wil be dropped by queueData()
+ // But note addRR has code to prevent that
+ if (pbMessage.size() < std::numeric_limits<uint16_t>::max() / 2) {
+ pbMessage.addRR(*i, luaconfsLocal->protobufExportConfig.exportTypes, udr);
+ }
}
}
if (needCommit)
pbf_rr.add_uint32(static_cast<protozero::pbf_tag_type>(pdns::ProtoZero::Message::RRField::class_), record.d_class);
pbf_rr.add_uint32(static_cast<protozero::pbf_tag_type>(pdns::ProtoZero::Message::RRField::ttl), record.d_ttl);
+ auto add = [&](const std::string& str) {
+ if (size() + str.length() < std::numeric_limits<uint16_t>::max() / 2) {
+ pbf_rr.add_string(static_cast<protozero::pbf_tag_type>(pdns::ProtoZero::Message::RRField::rdata), str);
+ }
+ };
+
switch (record.d_type) {
case QType::A: {
const auto& content = dynamic_cast<const ARecordContent&>(*(record.d_content));
}
case QType::CNAME: {
const auto& content = dynamic_cast<const CNAMERecordContent&>(*(record.d_content));
- pbf_rr.add_string(static_cast<protozero::pbf_tag_type>(pdns::ProtoZero::Message::RRField::rdata), content.getTarget().toString());
+ add(content.getTarget().toString());
break;
}
case QType::TXT: {
const auto& content = dynamic_cast<const TXTRecordContent&>(*(record.d_content));
- pbf_rr.add_string(static_cast<protozero::pbf_tag_type>(pdns::ProtoZero::Message::RRField::rdata), content.d_text);
+ add(content.d_text);
break;
}
case QType::NS: {
const auto& content = dynamic_cast<const NSRecordContent&>(*(record.d_content));
- pbf_rr.add_string(static_cast<protozero::pbf_tag_type>(pdns::ProtoZero::Message::RRField::rdata), content.getNS().toString());
+ add(content.getNS().toString());
break;
}
case QType::PTR: {
const auto& content = dynamic_cast<const PTRRecordContent&>(*(record.d_content));
- pbf_rr.add_string(static_cast<protozero::pbf_tag_type>(pdns::ProtoZero::Message::RRField::rdata), content.getContent().toString());
+ add(content.getContent().toString());
break;
}
case QType::MX: {
const auto& content = dynamic_cast<const MXRecordContent&>(*(record.d_content));
- pbf_rr.add_string(static_cast<protozero::pbf_tag_type>(pdns::ProtoZero::Message::RRField::rdata), content.d_mxname.toString());
+ add(content.d_mxname.toString());
break;
}
case QType::SPF: {
const auto& content = dynamic_cast<const SPFRecordContent&>(*(record.d_content));
- pbf_rr.add_string(static_cast<protozero::pbf_tag_type>(pdns::ProtoZero::Message::RRField::rdata), content.getText());
+ add(content.getText());
break;
}
case QType::SRV: {
const auto& content = dynamic_cast<const SRVRecordContent&>(*(record.d_content));
- pbf_rr.add_string(static_cast<protozero::pbf_tag_type>(pdns::ProtoZero::Message::RRField::rdata), content.d_target.toString());
+ add(content.d_target.toString());
break;
}
default:
void RemoteLogger::queueData(const std::string& data)
{
if (data.size() > std::numeric_limits<uint16_t>::max()) {
- throw std::runtime_error("Got a request to write an object of size " + std::to_string(data.size()));
+ const auto msg = "Not sending too large protobuf message";
+#ifdef WE_ARE_RECURSOR
+ g_log<<Logger::Info<<msg<<endl;
+#else
+ warnlog(msg);
+#endif
+ return;
}
auto runtime = d_runtime.lock();