return true;
}
-bool generateAnswerForTimeoutQuery(const PacketBuffer& query, PacketBuffer& answer, const DNSName& dnsQName, uint16_t qtype, uint16_t qclass)
-{
- auto& qname = dnsQName.getStorage();
- if (query.size() < sizeof(dnsheader) || qname.length() <= 1) {
- return false;
- }
- std::vector<uint8_t> qtc = {static_cast<uint8_t>(qtype>>8), static_cast<uint8_t>(qtype&0xff), static_cast<uint8_t>(qclass>>8), static_cast<uint8_t>(qclass&0xff)};
-
- answer.resize(sizeof(dnsheader) + qname.length() + 4);
- memcpy(&answer.at(0), &query.at(0), sizeof(dnsheader));
- memcpy(&answer.at(sizeof(dnsheader)), qname.c_str(), qname.length());
- memcpy(&answer.at(sizeof(dnsheader)+qname.length()), &qtc.at(0), 4);
-
- dnsdist::PacketMangling::editDNSHeaderFromPacket(answer, [](dnsheader& header) {
- header.qr = true;
- header.qdcount = htons(1);
- header.ancount = 0;
- header.nscount = 0;
- header.arcount = 0;
- return true;
- });
- return true;
-}
-
}
bool generateAnswerFromIPAddresses(DNSQuestion& dnsQuestion, const std::vector<ComboAddress>& addresses, const ResponseConfig& responseConfig);
bool generateAnswerFromRDataEntries(DNSQuestion& dnsQuestion, const std::vector<std::string>& entries, std::optional<uint16_t> typeForAny, const ResponseConfig& responseConfig);
bool generateAnswerFromRawPacket(DNSQuestion& dnsQuestion, const PacketBuffer& packet);
-bool generateAnswerForTimeoutQuery(const PacketBuffer& query, PacketBuffer& answer, const DNSName& dnsQName, uint16_t qtype, uint16_t qclass);
}
type: "Vec<ResponseRuleConfiguration>"
default: true
skip-serde: true
- description: "List of rules executed when a timeout event triggered from timer expiration or I/O error"
+ description: "List of rules executed when a timeout event triggered from timer expiration or network I/O error. Note that this rule is intent only for an action to restart a timed-out or network I/O failed query."
metrics:
description: "Metrics-related settings"
return true;
break;
case DNSResponseAction::Action::ServFail:
+ if (dnsResponse.getData().size() < sizeof(dnsheader)) {
+ return false;
+ }
dnsdist::PacketMangling::editDNSHeaderFromPacket(dnsResponse.getMutableData(), [](dnsheader& header) {
header.rcode = RCode::ServFail;
return true;
return true;
break;
case DNSResponseAction::Action::Truncate:
+ if (dnsResponse.getData().size() < sizeof(dnsheader)) {
+ return false;
+ }
if (!dnsResponse.overTCP()) {
dnsdist::PacketMangling::editDNSHeaderFromPacket(dnsResponse.getMutableData(), [](dnsheader& header) {
header.tc = true;
bool handleTimeoutResponseRules(const std::vector<dnsdist::rules::ResponseRuleAction>& rules, InternalQueryState& ids, const std::shared_ptr<DownstreamState>& d_ds, const std::shared_ptr<TCPQuerySender>& sender)
{
- if (!ids.d_packet || ids.d_packet->size() < sizeof(struct dnsheader)) {
- return false;
- }
-
- PacketBuffer answer;
- if (!dnsdist::self_answers::generateAnswerForTimeoutQuery(*ids.d_packet, answer, ids.qname, ids.qtype, ids.qclass)) {
- return false;
- }
-
- DNSResponse dnsResponse(ids, answer, d_ds);
+ PacketBuffer empty;
+ DNSResponse dnsResponse(ids, empty, d_ds);
auto protocol = dnsResponse.getProtocol();
vinfolog("Handling timeout response rules for incoming protocol = %s", protocol.toString());
.. versionadded:: 2.0.0
- Add a Rule and Action for timeout triggered from timer expiration or I/O error.
+ Add a Rule and Action for timeout triggered from timer expiration or network I/O error. Note that this rule is intent only for an action to restart a timed-out or network I/O failed query.
:param DNSrule rule: A :class:`DNSRule`, e.g. an :func:`AllRule`, or a compounded bunch of rules using e.g. :func:`AndRule`.
:param action: The action to take