diff options
| author | David Lönnhager <david.l@mullvad.net> | 2021-11-22 10:27:42 +0100 |
|---|---|---|
| committer | David Lönnhager <david.l@mullvad.net> | 2021-11-22 10:27:42 +0100 |
| commit | 200364c71f3495a8d33c3517118e4a5c2eba7432 (patch) | |
| tree | fde54fa7be87bc90f465ac65f29b2c1ce48a6fe0 | |
| parent | 0adb9d44c49647cba38736bf92962b84c1ed00ce (diff) | |
| parent | 69e883ab46e3ad20e3f122feb5763122d5f97db5 (diff) | |
| download | mullvadvpn-200364c71f3495a8d33c3517118e4a5c2eba7432.tar.xz mullvadvpn-200364c71f3495a8d33c3517118e4a5c2eba7432.zip | |
Merge branch 'fix-kill-sslocal'
| -rw-r--r-- | CHANGELOG.md | 2 | ||||
| -rw-r--r-- | talpid-core/src/process/openvpn.rs | 21 | ||||
| -rw-r--r-- | talpid-core/src/proxy/shadowsocks.rs | 24 |
3 files changed, 43 insertions, 4 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index d83727b056..397659152f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,6 +28,8 @@ Line wrap the file at 100 chars. Th instead of setting them to default values. ### Fixed +- Always kill `sslocal` if the tunnel monitor fails to start when using bridges. + #### Windows - Fix app size after changing display scale. - Fix daemon not starting if all excluded app paths reside on non-existent/unmounted volumes. diff --git a/talpid-core/src/process/openvpn.rs b/talpid-core/src/process/openvpn.rs index 7a469ab345..4c6c8e0dd8 100644 --- a/talpid-core/src/process/openvpn.rs +++ b/talpid-core/src/process/openvpn.rs @@ -10,7 +10,7 @@ use std::{ fmt, io, path::{Path, PathBuf}, }; -use talpid_types::net; +use talpid_types::{net, ErrorExt}; static BASE_ARGUMENTS: &[&[&str]] = &[ &["--client"], @@ -457,6 +457,25 @@ impl StoppableProcess for OpenVpnProcHandle { } } +impl Drop for OpenVpnProcHandle { + fn drop(&mut self) { + let result = match self.has_stopped() { + Ok(false) => self.kill(), + Err(e) => { + log::error!( + "{}", + e.display_chain_with_msg("Failed to check if OpenVPN is running") + ); + self.kill() + } + _ => Ok(()), + }; + if let Err(error) = result { + log::error!("{}", error.display_chain_with_msg("Failed to kill OpenVPN")); + } + } +} + #[cfg(test)] mod tests { diff --git a/talpid-core/src/proxy/shadowsocks.rs b/talpid-core/src/proxy/shadowsocks.rs index 326a264748..7fbf4cb5f9 100644 --- a/talpid-core/src/proxy/shadowsocks.rs +++ b/talpid-core/src/proxy/shadowsocks.rs @@ -114,7 +114,7 @@ impl fmt::Display for ShadowsocksCommand { } pub struct ShadowsocksProxyMonitor { - subproc: Arc<duct::Handle>, + subproc: Arc<ProcessHandle>, closed: Arc<AtomicBool>, port: u16, } @@ -125,6 +125,24 @@ const SHADOWSOCKS_BIN_FILENAME: &str = "sslocal"; #[cfg(windows)] const SHADOWSOCKS_BIN_FILENAME: &str = "sslocal.exe"; +struct ProcessHandle { + subproc: duct::Handle, +} + +impl Drop for ProcessHandle { + fn drop(&mut self) { + let _ = self.subproc.kill(); + } +} + +impl std::ops::Deref for ProcessHandle { + type Target = duct::Handle; + + fn deref(&self) -> &Self::Target { + &self.subproc + } +} + impl ShadowsocksProxyMonitor { pub fn start( settings: &ShadowsocksProxySettings, @@ -183,7 +201,7 @@ impl ShadowsocksProxyMonitor { match Self::get_bound_port(File::open(&logfile)?, &subproc) { Ok(port) => Ok(Self { - subproc: Arc::new(subproc), + subproc: Arc::new(ProcessHandle { subproc }), closed: Arc::new(AtomicBool::new(false)), port, }), @@ -272,7 +290,7 @@ impl ProxyMonitor for ShadowsocksProxyMonitor { } pub struct ShadowsocksProxyMonitorCloseHandle { - subproc: Arc<duct::Handle>, + subproc: Arc<ProcessHandle>, closed: Arc<AtomicBool>, } |
