summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2019-11-04 18:07:51 -0200
committerJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2019-11-04 18:07:51 -0200
commitb06e032cf911a1d5ffc73600962117bd95e813bd (patch)
treef545791dea42e5b7e535357d886ffa29b7c9e4ec
parente190243460b1dead2ced88ce3b2ae1d6a5499603 (diff)
parentaa0d602ce7f9ca205051819b91ee773943cd8f8d (diff)
downloadmullvadvpn-b06e032cf911a1d5ffc73600962117bd95e813bd.tar.xz
mullvadvpn-b06e032cf911a1d5ffc73600962117bd95e813bd.zip
Merge branch 'wireguard-log-handled-in-go'
-rw-r--r--CHANGELOG.md3
m---------dist-assets/binaries0
-rw-r--r--talpid-core/src/tunnel/mod.rs15
-rw-r--r--talpid-core/src/tunnel/wireguard/wireguard_go.rs24
4 files changed, 19 insertions, 23 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 374a6659c8..9e84f6b347 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -43,6 +43,9 @@ Line wrap the file at 100 chars. Th
- Recreate tun device after a fixed number of connection attempts on the same tun device.
### Fixed
+- Fix bad file descriptor errors caused by sending a file descriptor between the daemon and the
+ `wireguard-go` library.
+
#### Windows
- Detect removal of the OpenVPN TAP adapter on reconnection attempts.
- Improve robustness in path environment variable logic in Windows installer. Handle the case
diff --git a/dist-assets/binaries b/dist-assets/binaries
-Subproject 08489a83dbd30e466b9603fe5689c3028b08617
+Subproject 518786d67da146bff48a734e7a4ec452db79b67
diff --git a/talpid-core/src/tunnel/mod.rs b/talpid-core/src/tunnel/mod.rs
index d33182ddf3..6eaa77f8b8 100644
--- a/talpid-core/src/tunnel/mod.rs
+++ b/talpid-core/src/tunnel/mod.rs
@@ -221,13 +221,14 @@ impl TunnelMonitor {
log_dir: &Option<PathBuf>,
) -> Result<Option<PathBuf>> {
if let Some(ref log_dir) = log_dir {
- let filename = match parameters {
- TunnelParameters::OpenVpn(_) => OPENVPN_LOG_FILENAME,
- TunnelParameters::Wireguard(_) => WIREGUARD_LOG_FILENAME,
- };
- let tunnel_log = log_dir.join(filename);
- logging::rotate_log(&tunnel_log)?;
- Ok(Some(tunnel_log))
+ match parameters {
+ TunnelParameters::OpenVpn(_) => {
+ let tunnel_log = log_dir.join(OPENVPN_LOG_FILENAME);
+ logging::rotate_log(&tunnel_log)?;
+ Ok(Some(tunnel_log))
+ }
+ TunnelParameters::Wireguard(_) => Ok(Some(log_dir.join(WIREGUARD_LOG_FILENAME))),
+ }
} else {
Ok(None)
}
diff --git a/talpid-core/src/tunnel/wireguard/wireguard_go.rs b/talpid-core/src/tunnel/wireguard/wireguard_go.rs
index cd18e7a717..4e3b9c45fd 100644
--- a/talpid-core/src/tunnel/wireguard/wireguard_go.rs
+++ b/talpid-core/src/tunnel/wireguard/wireguard_go.rs
@@ -1,13 +1,7 @@
use super::{Config, Error, Result, Tunnel};
use crate::tunnel::tun_provider::{Tun, TunConfig, TunProvider};
use ipnetwork::IpNetwork;
-use std::{
- ffi::CString,
- fs,
- net::IpAddr,
- os::unix::io::{AsRawFd, RawFd},
- path::Path,
-};
+use std::{ffi::CString, net::IpAddr, os::unix::io::RawFd, path::Path, ptr};
#[cfg(target_os = "android")]
use talpid_types::BoxedError;
@@ -19,7 +13,6 @@ pub struct WgGoTunnel {
// holding on to the tunnel device and the log file ensures that the associated file handles
// live long enough and get closed when the tunnel is stopped
_tunnel_device: Box<dyn Tun>,
- _log_file: fs::File,
}
impl WgGoTunnel {
@@ -32,12 +25,16 @@ impl WgGoTunnel {
#[cfg_attr(not(target_os = "android"), allow(unused_mut))]
let (mut tunnel_device, tunnel_fd) = Self::get_tunnel(tun_provider, config, routes)?;
let interface_name: String = tunnel_device.interface_name().to_string();
- let log_file = prepare_log_file(log_path)?;
let wg_config_str = config.to_userspace_format();
let iface_name =
CString::new(interface_name.as_bytes()).map_err(Error::InterfaceNameError)?;
+ let log_path = log_path.and_then(|path| CString::new(path.to_string_lossy().as_ref()).ok());
+ let log_path_ptr = log_path
+ .as_ref()
+ .map(|path| path.as_ptr())
+ .unwrap_or_else(|| ptr::null());
let handle = unsafe {
wgTurnOnWithFd(
@@ -45,7 +42,7 @@ impl WgGoTunnel {
config.mtu as isize,
wg_config_str.as_ptr() as *const i8,
tunnel_fd,
- log_file.as_raw_fd(),
+ log_path_ptr as *const i8,
WG_GO_LOG_DEBUG,
)
};
@@ -66,7 +63,6 @@ impl WgGoTunnel {
interface_name,
handle: Some(handle),
_tunnel_device: tunnel_device,
- _log_file: log_file,
})
}
@@ -142,10 +138,6 @@ impl Drop for WgGoTunnel {
}
}
-fn prepare_log_file(log_path: Option<&Path>) -> Result<fs::File> {
- fs::File::create(log_path.unwrap_or("/dev/null".as_ref())).map_err(Error::PrepareLogFileError)
-}
-
impl Tunnel for WgGoTunnel {
fn get_interface_name(&self) -> &str {
&self.interface_name
@@ -180,7 +172,7 @@ extern "C" {
mtu: isize,
settings: *const i8,
fd: Fd,
- log_fd: Fd,
+ log_path: *const i8,
logLevel: WgLogLevel,
) -> i32;