Fixed bug with TXT parsing.

This commit is contained in:
Revertron
2026-03-20 11:13:00 +01:00
parent 2e1f05cadb
commit eb30037f53
5 changed files with 518 additions and 340 deletions
Generated
+501 -333
View File
File diff suppressed because it is too large Load Diff
+2 -1
View File
@@ -14,7 +14,7 @@ exclude = ["blockchain.db", "alfis.toml"]
getopts = "0.2.24"
log = "0.4.28"
simplelog = "0.12.2"
toml = "0.9.8"
toml = "0.9.12+spec-1.1.0"
sha2 = "0.10.9"
ed25519-dalek = "2.2.0"
x25519-dalek = { version = "2.0.1", features = ["reusable_secrets"] }
@@ -40,6 +40,7 @@ derive_more = { version = "2.0.1", features = ["display", "error", "from"] }
lazy_static = "1.5.0"
spmc = "0.3.0"
thread-priority = "3.0.0"
crossbeam-channel = "0.5.13"
# Optional dependencies regulated by features
wry = { version = "0.53", optional = true }
-1
View File
@@ -510,7 +510,6 @@ impl BootstrapResolver {
#[cfg(feature = "doh")]
impl Resolver for BootstrapResolver {
// TODO use timeout parameter
fn resolve(&self, uri: &Uri, _config: &Config, timeout: NextTimeout) -> std::result::Result<ResolvedSocketAddrs, ureq::Error> {
let domain = uri.host().unwrap_or("localhost");
let port = uri.port_u16().unwrap_or(443);
+9 -3
View File
@@ -312,11 +312,17 @@ impl DnsRecord {
}
QueryType::TXT => {
let mut txt = String::new();
let end_pos = buffer.pos() + data_len as usize;
// TXT RDATA consists of one or more <length><text> segments (RFC 1035 3.3.14)
while buffer.pos() < end_pos {
let seg_len = buffer.read()? as usize;
if seg_len > 0 {
let cur_pos = buffer.pos();
txt.push_str(&String::from_utf8_lossy(buffer.get_range(cur_pos, data_len as usize)?));
buffer.step(data_len as usize)?;
txt.push_str(&String::from_utf8_lossy(buffer.get_range(cur_pos, seg_len)?));
buffer.step(seg_len)?;
}
}
Ok(DnsRecord::TXT { domain, data: txt, ttl: TransientTtl(ttl) })
}
+5 -1
View File
@@ -107,7 +107,7 @@ pub fn execute_query(context: Arc<ServerContext>, request: &DnsPacket) -> DnsPac
let question = &request.questions[0];
packet.questions.push(question.clone());
log::trace!("Resolving: {}, type {:?}", &question.name, &question.qtype);
debug!("Resolving: {}, type {:?}", &question.name, &question.qtype);
let mut resolver = context.create_resolver(Arc::clone(&context));
let res_code = match resolver.resolve(&question.name, question.qtype, request.header.recursion_desired) {
@@ -246,6 +246,10 @@ impl DnsServer for DnsUdpServer {
debug!("UDP service loop has finished");
break;
}
if code == 10054 {
// Ignore
continue;
}
}
debug!("Failed to read from UDP socket: {:?}", err);
continue;