From 76956cfadefcebb7ae4ab136a6e727e2eee33d9e Mon Sep 17 00:00:00 2001 From: cyqsimon <28627918+cyqsimon@users.noreply.github.com> Date: Thu, 12 Oct 2023 19:40:23 +0800 Subject: Handle IPv4-mapped IPv6 addresses when resolving connection owner --- src/display/ui_state.rs | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/src/display/ui_state.rs b/src/display/ui_state.rs index 54ffbd1..179cba2 100644 --- a/src/display/ui_state.rs +++ b/src/display/ui_state.rs @@ -98,22 +98,31 @@ impl UIState { connections_to_procs: &'a HashMap, local_socket: &LocalSocket, ) -> Option<&'a String> { - let &LocalSocket { port, protocol, .. } = local_socket; - let name = connections_to_procs + // direct match .get(local_socket) + // IPv4-mapped IPv6 addresses + .or_else(|| { + let swapped: IpAddr = match local_socket.ip { + IpAddr::V4(v4) => v4.to_ipv6_mapped().into(), + IpAddr::V6(v6) => v6.to_ipv4_mapped()?.into(), + }; + connections_to_procs.get(&LocalSocket { + ip: swapped, + ..*local_socket + }) + }) + // address unspecified .or_else(|| { connections_to_procs.get(&LocalSocket { ip: Ipv4Addr::UNSPECIFIED.into(), - port, - protocol, + ..*local_socket }) }) .or_else(|| { connections_to_procs.get(&LocalSocket { ip: Ipv6Addr::UNSPECIFIED.into(), - port, - protocol, + ..*local_socket }) }); @@ -121,8 +130,9 @@ impl UIState { if name.is_none() && self.known_orphan_sockets.borrow_mut().insert(*local_socket) { match connections_to_procs .iter() - .find(|(socket, _)| socket.port == port && socket.protocol == protocol) - { + .find(|(&LocalSocket { port, protocol, .. }, _)| { + port == local_socket.port && protocol == local_socket.protocol + }) { Some((lookalike, name)) => { warn!( r#""{name}" owns a similar looking connection, but its local ip doesn't match."# -- cgit v1.2.3