summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorMarkus Pettersson <markus.pettersson@mullvad.net>2025-01-08 07:10:04 +0100
committerMarkus Pettersson <markus.pettersson@mullvad.net>2025-01-08 07:10:04 +0100
commit02c7148847246fc492948d8ffdb426792c5f1c64 (patch)
tree6401ddf413f81e684e4bbcf8a2c564732722e273
parentcd277a1e2c7251b4b142e5b58c33d3b95bc7ba6c (diff)
parent8af13101773d3cc49c28238172aef00c774e0628 (diff)
downloadmullvadvpn-02c7148847246fc492948d8ffdb426792c5f1c64.tar.xz
mullvadvpn-02c7148847246fc492948d8ffdb426792c5f1c64.zip
Merge branch 'patch-block-on-in-tokio-task'
-rw-r--r--CHANGELOG.md3
-rw-r--r--talpid-wireguard/src/lib.rs26
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,