From 36f93252a2cda50dea6881a4aa256a1b91438e22 Mon Sep 17 00:00:00 2001 From: Jorge Aparicio Date: Mon, 12 Feb 2024 19:11:59 +0100 Subject: [PATCH] resolver: check that the root servers list is not empty --- packages/dns-test/src/resolver.rs | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/packages/dns-test/src/resolver.rs b/packages/dns-test/src/resolver.rs index 12d94193..3a084f7a 100644 --- a/packages/dns-test/src/resolver.rs +++ b/packages/dns-test/src/resolver.rs @@ -12,6 +12,13 @@ pub struct Resolver { } impl Resolver { + /// Starts a DNS server in the recursive resolver role + /// + /// This server is not an authoritative name server; it does not server a zone file to clients + /// + /// # Panics + /// + /// This constructor panics if `roots` is an empty slice pub fn start( implementation: Implementation, roots: &[Root], @@ -19,6 +26,11 @@ impl Resolver { ) -> Result { const TRUST_ANCHOR_FILE: &str = "/etc/trusted-key.key"; + assert!( + !roots.is_empty(), + "must configure at least one local root server" + ); + let container = Container::run(implementation)?; let mut hints = String::new(); @@ -92,11 +104,19 @@ fn hickory_conf(use_dnssec: bool) -> String { #[cfg(test)] mod tests { + use crate::{name_server::NameServer, FQDN}; + use super::*; #[test] fn terminate_works() -> Result<()> { - let resolver = Resolver::start(Implementation::Unbound, &[], &TrustAnchor::empty())?; + let ns = NameServer::new(FQDN::ROOT)?.start()?; + + let resolver = Resolver::start( + Implementation::Unbound, + &[Root::new(ns.fqdn().clone(), ns.ipv4_addr())], + &TrustAnchor::empty(), + )?; let logs = resolver.terminate()?; eprintln!("{logs}");