aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHimbeer <himbeer@disroot.org>2024-08-19 21:56:54 +0200
committerHimbeer <himbeer@disroot.org>2024-08-19 21:56:54 +0200
commitcfb91b3125e35d4d02c78dfa1fd30928d29adf1c (patch)
treeff2de18f14f0fddf86092e6493c2996075438938
parentaee8706bc84d98e96f7a30f1c3dbc1411f4d06a6 (diff)
Fix hosts file reverse lookups panicking with PrefixLenError
This error can occur if there is a mismatch between the IP version being queried and the version of the hosts file entry that is currently being checked. The fix is to filter for entries that match the IP version of the query contents.
-rw-r--r--src/main.rs22
1 files changed, 14 insertions, 8 deletions
diff --git a/src/main.rs b/src/main.rs
index fae9f94..ceec7bd 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -513,17 +513,23 @@ fn file_entry(
let (host, addr) = if Name::from_str("in-addr.arpa.").unwrap().zone_of(hostname)
&& hostname.iter().len() <= 6
{
- let (host, addr) = hosts.iter().find(|(_, addr)| {
- IpNet::new(**addr, 32).unwrap()
- == hostname.parse_arpa_name().expect("can't parse arpa name")
- })?;
+ let (host, addr) = hosts
+ .iter()
+ .filter(|(_, addr)| addr.is_ipv4())
+ .find(|(_, addr)| {
+ IpNet::new(**addr, 32).unwrap()
+ == hostname.parse_arpa_name().expect("can't parse arpa name")
+ })?;
(host.clone(), *addr)
} else if Name::from_str("ip6.arpa.").unwrap().zone_of(hostname) && hostname.iter().len() <= 34
{
- let (host, addr) = hosts.iter().find(|(_, addr)| {
- IpNet::new(**addr, 128).unwrap()
- == hostname.parse_arpa_name().expect("can't parse arpa name")
- })?;
+ let (host, addr) = hosts
+ .iter()
+ .filter(|(_, addr)| addr.is_ipv6())
+ .find(|(_, addr)| {
+ IpNet::new(**addr, 128).unwrap()
+ == hostname.parse_arpa_name().expect("can't parse arpa name")
+ })?;
(host.clone(), *addr)
} else {
let hostname_utf8 = hostname.to_utf8();