diff options
author | Himbeer <himbeer@disroot.org> | 2024-08-19 21:56:54 +0200 |
---|---|---|
committer | Himbeer <himbeer@disroot.org> | 2024-08-19 21:56:54 +0200 |
commit | cfb91b3125e35d4d02c78dfa1fd30928d29adf1c (patch) | |
tree | ff2de18f14f0fddf86092e6493c2996075438938 | |
parent | aee8706bc84d98e96f7a30f1c3dbc1411f4d06a6 (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.rs | 22 |
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(); |