From cfb91b3125e35d4d02c78dfa1fd30928d29adf1c Mon Sep 17 00:00:00 2001 From: Himbeer Date: Mon, 19 Aug 2024 21:56:54 +0200 Subject: 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. --- src/main.rs | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) (limited to 'src') 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(); -- cgit v1.2.3