From 7ddd0365b8b3d4e587c78103dc3d26e8cd888865 Mon Sep 17 00:00:00 2001 From: Andreas Rammhold Date: Wed, 9 Nov 2022 00:27:19 +0100 Subject: [PATCH] Handle IPv6-only results even in GETHOSTBYNAME Previously IPv6-only results would return an empty successful result message. This doesn't seem to be a valid response from the perspective of Glibc. In my case it caused Firefox to crash. --- src/handlers.rs | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/src/handlers.rs b/src/handlers.rs index 544257b..ba2d5b5 100644 --- a/src/handlers.rs +++ b/src/handlers.rs @@ -200,17 +200,20 @@ pub fn handle_request(log: &Logger, request: &protocol::Request) -> Result { - let addresses: std::io::Result> = addrs - .filter(|x| match x { - Err(_) => false, - Ok(addr) => addr.sockaddr.is_ipv4(), - }) - .map(|r| r.map(|a| a.sockaddr.ip())) - .collect(); + let host = match getaddrinfo(Some(hostname), None, Some(hints)) + .map(|addrs| + addrs.filter_map(|r| r.ok()) + .filter(|r| r.sockaddr.is_ipv4()) + .map(|a| a.sockaddr.ip()) + .collect::>()) + { + // no matches found + Ok(addresses) if addresses.len() == 0 => { + Ok(None) + } + Ok(addresses) => { Ok(Some(Host { - addresses: addresses?, + addresses, hostname: hostname.to_string(), })) }