diff options
| author | Markus Pettersson <markus.pettersson@mullvad.net> | 2025-01-08 07:10:04 +0100 |
|---|---|---|
| committer | Markus Pettersson <markus.pettersson@mullvad.net> | 2025-01-08 07:10:04 +0100 |
| commit | 02c7148847246fc492948d8ffdb426792c5f1c64 (patch) | |
| tree | 6401ddf413f81e684e4bbcf8a2c564732722e273 | |
| parent | cd277a1e2c7251b4b142e5b58c33d3b95bc7ba6c (diff) | |
| parent | 8af13101773d3cc49c28238172aef00c774e0628 (diff) | |
| download | mullvadvpn-02c7148847246fc492948d8ffdb426792c5f1c64.tar.xz mullvadvpn-02c7148847246fc492948d8ffdb426792c5f1c64.zip | |
Merge branch 'patch-block-on-in-tokio-task'
| -rw-r--r-- | CHANGELOG.md | 3 | ||||
| -rw-r--r-- | talpid-wireguard/src/lib.rs | 26 |
2 files changed, 25 insertions, 4 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index 060bad90ad..0c76142415 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -31,6 +31,9 @@ Line wrap the file at 100 chars. Th provided by relays instead of a bundled list. The bundled `maybenot_machines` file was removed. - Update Electron from 30.0.4 to 33.2.1. +### Fixed +- Fix crash when Wireguard tunnel setup timed out. + ## [2025.1] - 2025-01-02 ### Fixed #### macOS diff --git a/talpid-wireguard/src/lib.rs b/talpid-wireguard/src/lib.rs index cb19559dcf..1da4cf1be5 100644 --- a/talpid-wireguard/src/lib.rs +++ b/talpid-wireguard/src/lib.rs @@ -281,7 +281,13 @@ impl WireguardMonitor { // timing out on Windows for 2024.9-beta1. These verbose data usage logs are // a temporary measure to help us understand the issue. They can be removed // if the issue is resolved. - log_tunnel_data_usage(&config, &tunnel).await; + if let Err(err) = + tokio::task::spawn_blocking(move || log_tunnel_data_usage(&config, &tunnel)) + .await + { + log::error!("Failed to log tunnel data during setup phase"); + log::error!("{err}"); + } return Err(e); } @@ -486,7 +492,13 @@ impl WireguardMonitor { // timing out on Windows for 2024.9-beta1. These verbose data usage logs are // a temporary measure to help us understand the issue. They can be removed // if the issue is resolved. - log_tunnel_data_usage(&config, &tunnel).await; + if let Err(err) = + tokio::task::spawn_blocking(move || log_tunnel_data_usage(&config, &tunnel)) + .await + { + log::error!("Failed to log tunnel data during setup phase"); + log::error!("{err}"); + } return Err(e); } @@ -981,8 +993,12 @@ impl WireguardMonitor { } } -async fn log_tunnel_data_usage(config: &Config, tunnel: &Arc<AsyncMutex<Option<TunnelType>>>) { - let tunnel = tunnel.lock().await; +/// Log the tunnel stats from the current tunnel. +/// +/// This will log the amount of outgoing and incoming data to and from the exit (and entry) relay +/// so far. +fn log_tunnel_data_usage(config: &Config, tunnel: &Arc<AsyncMutex<Option<TunnelType>>>) { + let tunnel = tunnel.blocking_lock(); let Some(tunnel) = &*tunnel else { return }; let Ok(tunnel_stats) = tunnel.get_tunnel_stats() else { return; @@ -1015,6 +1031,8 @@ enum CloseMsg { pub(crate) trait Tunnel: Send { fn get_interface_name(&self) -> String; fn stop(self: Box<Self>) -> std::result::Result<(), TunnelError>; + /// # Note + /// This function should *not* be called from within an async context. fn get_tunnel_stats(&self) -> std::result::Result<stats::StatsMap, TunnelError>; fn set_config<'a>( &'a mut self, |
