summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorDavid Lönnhager <david.l@mullvad.net>2024-10-30 21:08:11 +0100
committerDavid Lönnhager <david.l@mullvad.net>2024-11-01 10:16:26 +0100
commite718179f768970b0b150a1f47471c8667da5c50f (patch)
tree38568cfaefc55ea541f8b3ed941f078e980048be
parentf0717f54ec71115e042841553fc81ebf5884111b (diff)
downloadmullvadvpn-e718179f768970b0b150a1f47471c8667da5c50f.tar.xz
mullvadvpn-e718179f768970b0b150a1f47471c8667da5c50f.zip
Add unit test for maybenot machines for wg-go
-rw-r--r--talpid-wireguard/src/wireguard_go/mod.rs40
-rw-r--r--wireguard-go-rs/src/lib.rs21
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 {