diff options
| author | David Lönnhager <david.l@mullvad.net> | 2024-11-01 10:17:12 +0100 |
|---|---|---|
| committer | David Lönnhager <david.l@mullvad.net> | 2024-11-01 10:17:12 +0100 |
| commit | dfa90cb0fb0357d1072133b4942f066a63a73907 (patch) | |
| tree | 98469b1ab101221618702d657e6e021e6b720814 | |
| parent | a95fecf479e7fc3edd35122456360c7828418f44 (diff) | |
| parent | b1b757e1752e3868bc2b65735b59d19648beb20d (diff) | |
| download | mullvadvpn-dfa90cb0fb0357d1072133b4942f066a63a73907.tar.xz mullvadvpn-dfa90cb0fb0357d1072133b4942f066a63a73907.zip | |
Merge branch 'add-maybenot-test'
| -rw-r--r-- | talpid-wireguard/src/wireguard_go/mod.rs | 42 | ||||
| -rw-r--r-- | talpid-wireguard/src/wireguard_nt/daita.rs | 62 | ||||
| -rw-r--r-- | wireguard-go-rs/src/lib.rs | 21 |
3 files changed, 94 insertions, 31 deletions
diff --git a/talpid-wireguard/src/wireguard_go/mod.rs b/talpid-wireguard/src/wireguard_go/mod.rs index 28470a0e46..f9a062f3c8 100644 --- a/talpid-wireguard/src/wireguard_go/mod.rs +++ b/talpid-wireguard/src/wireguard_go/mod.rs @@ -218,16 +218,8 @@ impl Tunnel for WgGoTunnel { #[cfg(daita)] fn start_daita(&mut self) -> Result<()> { static MAYBENOT_MACHINES: OnceCell<CString> = OnceCell::new(); - let machines = MAYBENOT_MACHINES.get_or_try_init(|| { - let path = self.resource_dir.join("maybenot_machines_v2"); - log::debug!("Reading maybenot machines from {}", path.display()); - - let machines = - fs::read_to_string(path).map_err(|e| TunnelError::StartDaita(Box::new(e)))?; - let machines = - CString::new(machines).map_err(|e| TunnelError::StartDaita(Box::new(e)))?; - Ok(machines) - })?; + let machines = + MAYBENOT_MACHINES.get_or_try_init(|| load_maybenot_machines(&self.resource_dir))?; log::info!("Initializing DAITA for wireguard device"); let peer_public_key = &self.config.entry_peer.public_key; @@ -244,6 +236,36 @@ impl Tunnel for WgGoTunnel { } } +#[cfg(daita)] +fn load_maybenot_machines(resource_dir: &Path) -> Result<CString> { + let path = resource_dir.join("maybenot_machines_v2"); + log::debug!("Reading maybenot machines from {}", path.display()); + + let machines = fs::read_to_string(path).map_err(|e| TunnelError::StartDaita(Box::new(e)))?; + let machines = CString::new(machines).map_err(|e| TunnelError::StartDaita(Box::new(e)))?; + Ok(machines) +} + +#[cfg(test)] +mod test { + /// Test whether `maybenot_machines` in dist-assets contains valid machines. + /// TODO: Remove when switching to dynamic machines. + #[cfg(daita)] + #[test] + fn test_load_maybenot_machines() { + use super::load_maybenot_machines; + use std::path::PathBuf; + + let dist_assets = std::env::var("CARGO_MANIFEST_DIR") + .map(PathBuf::from) + .expect("CARGO_MANIFEST_DIR env var not set") + .join("..") + .join("dist-assets"); + let machines = load_maybenot_machines(&dist_assets).unwrap(); + wireguard_go_rs::validate_maybenot_machines(&machines).unwrap(); + } +} + mod stats { use super::{Stats, StatsMap}; diff --git a/talpid-wireguard/src/wireguard_nt/daita.rs b/talpid-wireguard/src/wireguard_nt/daita.rs index 88c16c6a91..135ea9a2fd 100644 --- a/talpid-wireguard/src/wireguard_nt/daita.rs +++ b/talpid-wireguard/src/wireguard_nt/daita.rs @@ -250,26 +250,8 @@ impl Machinist { static MAYBENOT_MACHINES: OnceCell<Vec<maybenot::Machine>> = OnceCell::new(); - let machines = MAYBENOT_MACHINES.get_or_try_init(|| { - let path = resource_dir.join("maybenot_machines_v2"); - log::debug!("Reading maybenot machines from {}", path.display()); - - let mut machines = vec![]; - let machines_str = fs::read_to_string(path).map_err(Error::EnumerateMachines)?; - for machine_str in machines_str.lines() { - let machine_str = machine_str.trim(); - if matches!(machine_str.chars().next(), None | Some('#')) { - continue; - } - log::debug!("Adding maybenot machine: {machine_str}"); - machines.push( - machine_str - .parse::<maybenot::Machine>() - .map_err(|_error| Error::InvalidMachine(machine_str.to_owned()))?, - ); - } - Ok(machines) - })?; + let machines = + MAYBENOT_MACHINES.get_or_try_init(|| load_maybenot_machines(resource_dir))?; let quit_event = talpid_windows::sync::Event::new(true, false).map_err(Error::InitializeQuitEvent)?; @@ -456,3 +438,43 @@ impl Machinist { } } } + +fn load_maybenot_machines(resource_dir: &Path) -> Result<Vec<maybenot::Machine>, Error> { + let path = resource_dir.join("maybenot_machines_v2"); + log::debug!("Reading maybenot machines from {}", path.display()); + + let mut machines = vec![]; + let machines_str = fs::read_to_string(path).map_err(Error::EnumerateMachines)?; + for machine_str in machines_str.lines() { + let machine_str = machine_str.trim(); + if matches!(machine_str.chars().next(), None | Some('#')) { + continue; + } + log::debug!("Adding maybenot machine: {machine_str}"); + machines.push( + machine_str + .parse::<maybenot::Machine>() + .map_err(|_error| Error::InvalidMachine(machine_str.to_owned()))?, + ); + } + Ok(machines) +} + +#[cfg(test)] +mod test { + use super::load_maybenot_machines; + use std::path::PathBuf; + + /// Test whether `maybenot_machines` in dist-assets contains valid machines. + /// TODO: Remove when switching to dynamic machines. + #[test] + fn test_load_maybenot_machines() { + let dist_assets = std::env::var("CARGO_MANIFEST_DIR") + .map(PathBuf::from) + .expect("CARGO_MANIFEST_DIR env var not set") + .join("..") + .join("dist-assets"); + + load_maybenot_machines(&dist_assets).unwrap(); + } +} diff --git a/wireguard-go-rs/src/lib.rs b/wireguard-go-rs/src/lib.rs index 6bacd325b5..a77b48c0bd 100644 --- a/wireguard-go-rs/src/lib.rs +++ b/wireguard-go-rs/src/lib.rs @@ -11,7 +11,7 @@ use core::slice; use std::{ ffi::{c_char, CStr}, - mem::ManuallyDrop, + mem::{ManuallyDrop, MaybeUninit}, }; use util::OnDrop; use zeroize::Zeroize; @@ -199,6 +199,25 @@ impl Drop for Tunnel { } } +/// Check whether `machines` contains a valid, LF-separated maybenot machines. Return an error +/// otherwise. +pub fn validate_maybenot_machines(machines: &CStr) -> Result<(), Error> { + use maybenot_ffi::MaybenotResult; + + let mut framework = MaybeUninit::uninit(); + // SAFETY: `machines` is a null-terminated string, and `&mut framework` is a valid pointer + let result = + unsafe { maybenot_ffi::maybenot_start(machines.as_ptr(), 0.0, 0.0, &mut framework) }; + + if result as u32 == MaybenotResult::Ok as u32 { + // SAFETY: `maybenot_start` succeeded, so `framework` points to a valid framework + unsafe { maybenot_ffi::maybenot_stop(framework.assume_init()) }; + Ok(()) + } else { + Err(Error::Other) + } +} + fn result_from_code(code: i32) -> Result<(), Error> { // NOTE: must be kept in sync with enum definition Err(match code { |
