From f67cf15be13f3dc5c67466c7bc3d7ccf6b16a2d8 Mon Sep 17 00:00:00 2001 From: Linus Färnstrand Date: Tue, 21 Apr 2026 15:02:25 +0000 Subject: Convert LeakInfo from single-variant enum to struct --- mullvad-daemon/src/management_interface.rs | 12 +++--------- mullvad-leak-checker/src/lib.rs | 14 ++++++-------- mullvad-leak-checker/src/traceroute/unix/linux_like.rs | 10 ++++------ mullvad-leak-checker/src/traceroute/unix/macos.rs | 2 +- mullvad-leak-checker/src/traceroute/windows.rs | 10 ++++------ 5 files changed, 18 insertions(+), 30 deletions(-) diff --git a/mullvad-daemon/src/management_interface.rs b/mullvad-daemon/src/management_interface.rs index 5de38f50b4..a1df9a27db 100644 --- a/mullvad-daemon/src/management_interface.rs +++ b/mullvad-daemon/src/management_interface.rs @@ -1485,17 +1485,11 @@ impl ManagementInterfaceEventBroadcaster { /// Notify clients about a potential leak. pub(crate) fn notify_leak(&self, leak: mullvad_leak_checker::LeakInfo) { - use mullvad_leak_checker::LeakInfo; - let LeakInfo::NodeReachableOnInterface { + log::trace!("Broadcasting leak info: {leak:#?}"); + let mullvad_leak_checker::LeakInfo { reachable_nodes, interface, - } = &leak - else { - log::trace!("Matched on unexpected leak checker event: {leak:#?}"); - return; - }; - - log::trace!("Broadcasting leak info: {leak:#?}"); + } = &leak; let interface = match interface { mullvad_leak_checker::Interface::Name(name) => name.to_owned(), #[cfg(target_os = "macos")] diff --git a/mullvad-leak-checker/src/lib.rs b/mullvad-leak-checker/src/lib.rs index 5bd18bc094..e5f1163568 100644 --- a/mullvad-leak-checker/src/lib.rs +++ b/mullvad-leak-checker/src/lib.rs @@ -9,15 +9,13 @@ pub enum LeakStatus { LeakDetected(LeakInfo), } -/// Details about how a leak happened +/// Details about how a leak happened. +/// +/// Managed to reach another network node on the physical interface, bypassing firewall rules. #[derive(Clone, Debug)] -#[non_exhaustive] -pub enum LeakInfo { - /// Managed to reach another network node on the physical interface, bypassing firewall rules. - NodeReachableOnInterface { - reachable_nodes: Vec, - interface: Interface, - }, +pub struct LeakInfo { + pub reachable_nodes: Vec, + pub interface: Interface, } #[derive(Clone)] diff --git a/mullvad-leak-checker/src/traceroute/unix/linux_like.rs b/mullvad-leak-checker/src/traceroute/unix/linux_like.rs index dbca77fd2b..622949d6f7 100644 --- a/mullvad-leak-checker/src/traceroute/unix/linux_like.rs +++ b/mullvad-leak-checker/src/traceroute/unix/linux_like.rs @@ -252,12 +252,10 @@ async fn recv_ttl_responses( debug_assert!(!reachable_nodes.is_empty()); - Ok(LeakStatus::LeakDetected( - LeakInfo::NodeReachableOnInterface { - reachable_nodes, - interface: interface.clone(), - }, - )) + Ok(LeakStatus::LeakDetected(LeakInfo { + reachable_nodes, + interface: interface.clone(), + })) } struct RecvPacket<'a, S> { diff --git a/mullvad-leak-checker/src/traceroute/unix/macos.rs b/mullvad-leak-checker/src/traceroute/unix/macos.rs index 0fe1054ba3..3cf95dcfeb 100644 --- a/mullvad-leak-checker/src/traceroute/unix/macos.rs +++ b/mullvad-leak-checker/src/traceroute/unix/macos.rs @@ -142,7 +142,7 @@ async fn recv_ttl_responses( .context("Failed to read from raw socket")?, _timeout = timer => { - return Ok(LeakStatus::LeakDetected(LeakInfo::NodeReachableOnInterface { + return Ok(LeakStatus::LeakDetected(LeakInfo { reachable_nodes, interface: interface.clone(), })); diff --git a/mullvad-leak-checker/src/traceroute/windows.rs b/mullvad-leak-checker/src/traceroute/windows.rs index 6f6c787150..79a39cae4d 100644 --- a/mullvad-leak-checker/src/traceroute/windows.rs +++ b/mullvad-leak-checker/src/traceroute/windows.rs @@ -86,12 +86,10 @@ pub async fn traceroute_using_ping(opt: &TracerouteOpt) -> anyhow::Result