diff options
| author | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2019-09-30 08:35:49 -0300 |
|---|---|---|
| committer | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2019-09-30 08:35:49 -0300 |
| commit | 2d251912b18cc7a002bdcccd903f9cd8c8bf3eac (patch) | |
| tree | 6a0c55129538e09b229951a21a0c424439952d48 | |
| parent | b49a7d7f0457bea5840d5fad0ed611c8d05d6576 (diff) | |
| parent | d6da69b29de3a1c970f1a30703132e4b0497db9c (diff) | |
| download | mullvadvpn-2d251912b18cc7a002bdcccd903f9cd8c8bf3eac.tar.xz mullvadvpn-2d251912b18cc7a002bdcccd903f9cd8c8bf3eac.zip | |
Merge branch 'fix-bad-fd-handling'
| -rw-r--r-- | talpid-core/src/tunnel/wireguard/mod.rs | 4 | ||||
| -rw-r--r-- | talpid-core/src/tunnel/wireguard/wireguard_go.rs | 23 |
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"), + )) } } |
