summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2019-09-30 08:35:49 -0300
committerJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2019-09-30 08:35:49 -0300
commit2d251912b18cc7a002bdcccd903f9cd8c8bf3eac (patch)
tree6a0c55129538e09b229951a21a0c424439952d48
parentb49a7d7f0457bea5840d5fad0ed611c8d05d6576 (diff)
parentd6da69b29de3a1c970f1a30703132e4b0497db9c (diff)
downloadmullvadvpn-2d251912b18cc7a002bdcccd903f9cd8c8bf3eac.tar.xz
mullvadvpn-2d251912b18cc7a002bdcccd903f9cd8c8bf3eac.zip
Merge branch 'fix-bad-fd-handling'
-rw-r--r--talpid-core/src/tunnel/wireguard/mod.rs4
-rw-r--r--talpid-core/src/tunnel/wireguard/wireguard_go.rs23
2 files changed, 11 insertions, 16 deletions
diff --git a/talpid-core/src/tunnel/wireguard/mod.rs b/talpid-core/src/tunnel/wireguard/mod.rs
index 861134d2ef..024bab2a91 100644
--- a/talpid-core/src/tunnel/wireguard/mod.rs
+++ b/talpid-core/src/tunnel/wireguard/mod.rs
@@ -60,9 +60,9 @@ pub enum Error {
#[error(display = "Failed to configure Wireguard sockets to bypass the tunnel")]
BypassError(#[error(cause)] BoxedError),
- /// Failed to duplicate file descriptors for logging on wireguard-go
+ /// Failed to duplicate tunnel file descriptor for wireguard-go
#[cfg(any(target_os = "linux", target_os = "macos", target_os = "android"))]
- #[error(display = "Failed to configure Wireguard sockets to bypass the tunnel")]
+ #[error(display = "Failed to duplicate tunnel file descriptor for wireguard-go")]
FdDuplicationError(#[error(cause)] nix::Error),
/// Pinging timed out.
diff --git a/talpid-core/src/tunnel/wireguard/wireguard_go.rs b/talpid-core/src/tunnel/wireguard/wireguard_go.rs
index ff45685191..cd18e7a717 100644
--- a/talpid-core/src/tunnel/wireguard/wireguard_go.rs
+++ b/talpid-core/src/tunnel/wireguard/wireguard_go.rs
@@ -111,31 +111,26 @@ impl WgGoTunnel {
config: &Config,
routes: impl Iterator<Item = IpNetwork>,
) -> Result<(Box<dyn Tun>, RawFd)> {
+ let mut last_error = None;
let tunnel_config = Self::create_tunnel_config(config, routes);
+
for _ in 1..=MAX_PREPARE_TUN_ATTEMPTS {
let tunnel_device = tun_provider
.get_tun(tunnel_config.clone())
.map_err(Error::SetupTunnelDeviceError)?;
match nix::unistd::dup(tunnel_device.as_raw_fd()) {
- Ok(fd) => {
- return Ok((tunnel_device, fd));
- }
+ Ok(fd) => return Ok((tunnel_device, fd)),
#[cfg(not(target_os = "macos"))]
- Err(nix::Error::Sys(nix::errno::Errno::EBADFD)) => continue,
- #[cfg(target_os = "macos")]
- Err(nix::Error::Sys(nix::errno::Errno::EBADF)) => continue,
+ Err(error @ nix::Error::Sys(nix::errno::Errno::EBADFD)) => last_error = Some(error),
+ Err(error @ nix::Error::Sys(nix::errno::Errno::EBADF)) => last_error = Some(error),
Err(error) => return Err(Error::FdDuplicationError(error)),
}
}
- #[cfg(not(target_os = "macos"))]
- return Err(Error::FdDuplicationError(nix::Error::Sys(
- nix::errno::Errno::EBADFD,
- )));
- #[cfg(target_os = "macos")]
- return Err(Error::FdDuplicationError(nix::Error::Sys(
- nix::errno::Errno::EBADF,
- )));
+
+ Err(Error::FdDuplicationError(
+ last_error.expect("Should be collected in loop"),
+ ))
}
}