Very important DNS resolver fix.
This commit is contained in:
@@ -155,7 +155,7 @@ impl DnsFilter for BlockchainFilter {
|
|||||||
// Create DnsPacket
|
// Create DnsPacket
|
||||||
let mut packet = DnsPacket::new();
|
let mut packet = DnsPacket::new();
|
||||||
packet.header.authoritative_answer = true;
|
packet.header.authoritative_answer = true;
|
||||||
packet.header.rescode = ResultCode::NXDOMAIN;
|
packet.header.rescode = ResultCode::NOERROR;
|
||||||
packet.questions.push(DnsQuestion::new(String::from(qname), qtype));
|
packet.questions.push(DnsQuestion::new(String::from(qname), qtype));
|
||||||
packet.authorities.push(DnsRecord::SOA {
|
packet.authorities.push(DnsRecord::SOA {
|
||||||
domain: zone,
|
domain: zone,
|
||||||
|
|||||||
+11
-6
@@ -61,12 +61,7 @@ pub trait DnsServer {
|
|||||||
|
|
||||||
/// Utility function for resolving domains referenced in for example CNAME or SRV
|
/// Utility function for resolving domains referenced in for example CNAME or SRV
|
||||||
/// records. This usually spares the client from having to perform additional lookups.
|
/// records. This usually spares the client from having to perform additional lookups.
|
||||||
fn resolve_cnames(
|
fn resolve_cnames(lookup_list: &[DnsRecord], results: &mut Vec<DnsPacket>, resolver: &mut Box<dyn DnsResolver>, depth: u16,) {
|
||||||
lookup_list: &[DnsRecord],
|
|
||||||
results: &mut Vec<DnsPacket>,
|
|
||||||
resolver: &mut Box<dyn DnsResolver>,
|
|
||||||
depth: u16,
|
|
||||||
) {
|
|
||||||
if depth > 10 {
|
if depth > 10 {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -78,6 +73,12 @@ fn resolve_cnames(
|
|||||||
let new_unmatched = result2.get_unresolved_cnames();
|
let new_unmatched = result2.get_unresolved_cnames();
|
||||||
results.push(result2);
|
results.push(result2);
|
||||||
|
|
||||||
|
resolve_cnames(&new_unmatched, results, resolver, depth + 1);
|
||||||
|
}
|
||||||
|
if let Ok(result2) = resolver.resolve(host, QueryType::AAAA, true) {
|
||||||
|
let new_unmatched = result2.get_unresolved_cnames();
|
||||||
|
results.push(result2);
|
||||||
|
|
||||||
resolve_cnames(&new_unmatched, results, resolver, depth + 1);
|
resolve_cnames(&new_unmatched, results, resolver, depth + 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -99,6 +100,7 @@ pub fn execute_query(context: Arc<ServerContext>, request: &DnsPacket) -> DnsPac
|
|||||||
let mut packet = DnsPacket::new();
|
let mut packet = DnsPacket::new();
|
||||||
packet.header.id = request.header.id;
|
packet.header.id = request.header.id;
|
||||||
packet.header.recursion_available = context.allow_recursive;
|
packet.header.recursion_available = context.allow_recursive;
|
||||||
|
packet.header.recursion_desired = request.header.recursion_desired;
|
||||||
packet.header.response = true;
|
packet.header.response = true;
|
||||||
|
|
||||||
if request.header.recursion_desired && !context.allow_recursive {
|
if request.header.recursion_desired && !context.allow_recursive {
|
||||||
@@ -115,6 +117,9 @@ pub fn execute_query(context: Arc<ServerContext>, request: &DnsPacket) -> DnsPac
|
|||||||
let rescode = match resolver.resolve(&question.name, question.qtype, request.header.recursion_desired) {
|
let rescode = match resolver.resolve(&question.name, question.qtype, request.header.recursion_desired) {
|
||||||
Ok(result) => {
|
Ok(result) => {
|
||||||
let rescode = result.header.rescode;
|
let rescode = result.header.rescode;
|
||||||
|
if result.header.authoritative_answer {
|
||||||
|
packet.header.authoritative_answer = true;
|
||||||
|
}
|
||||||
|
|
||||||
let unmatched = result.get_unresolved_cnames();
|
let unmatched = result.get_unresolved_cnames();
|
||||||
results.push(result);
|
results.push(result);
|
||||||
|
|||||||
Reference in New Issue
Block a user