summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorDavid Lönnhager <david.l@mullvad.net>2021-11-22 10:27:42 +0100
committerDavid Lönnhager <david.l@mullvad.net>2021-11-22 10:27:42 +0100
commit200364c71f3495a8d33c3517118e4a5c2eba7432 (patch)
treefde54fa7be87bc90f465ac65f29b2c1ce48a6fe0
parent0adb9d44c49647cba38736bf92962b84c1ed00ce (diff)
parent69e883ab46e3ad20e3f122feb5763122d5f97db5 (diff)
downloadmullvadvpn-200364c71f3495a8d33c3517118e4a5c2eba7432.tar.xz
mullvadvpn-200364c71f3495a8d33c3517118e4a5c2eba7432.zip
Merge branch 'fix-kill-sslocal'
-rw-r--r--CHANGELOG.md2
-rw-r--r--talpid-core/src/process/openvpn.rs21
-rw-r--r--talpid-core/src/proxy/shadowsocks.rs24
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>,
}