diff options
| author | David Lönnhager <david.l@mullvad.net> | 2024-10-30 21:08:11 +0100 |
|---|---|---|
| committer | David Lönnhager <david.l@mullvad.net> | 2024-11-01 10:16:26 +0100 |
| commit | e718179f768970b0b150a1f47471c8667da5c50f (patch) | |
| tree | 38568cfaefc55ea541f8b3ed941f078e980048be | |
| parent | f0717f54ec71115e042841553fc81ebf5884111b (diff) | |
| download | mullvadvpn-e718179f768970b0b150a1f47471c8667da5c50f.tar.xz mullvadvpn-e718179f768970b0b150a1f47471c8667da5c50f.zip | |
Add unit test for maybenot machines for wg-go
| -rw-r--r-- | talpid-wireguard/src/wireguard_go/mod.rs | 40 | ||||
| -rw-r--r-- | wireguard-go-rs/src/lib.rs | 21 |
2 files changed, 50 insertions, 11 deletions
diff --git a/talpid-wireguard/src/wireguard_go/mod.rs b/talpid-wireguard/src/wireguard_go/mod.rs index 28470a0e46..108b54d15f 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,34 @@ 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 { + #[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/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 { |
