summaryrefslogtreecommitdiffhomepage
path: root/talpid-core/src
diff options
context:
space:
mode:
authorDavid Lönnhager <david.l@mullvad.net>2022-04-01 14:39:19 +0200
committerDavid Lönnhager <david.l@mullvad.net>2022-04-05 10:34:01 +0200
commit3a2e2fffdf3630102e5bcf0bcf60076057a98b65 (patch)
tree059d50444cd7e48cc28a54bf05fc6e7ffaf8d0c2 /talpid-core/src
parent5e3dd68495073a6a4b00ae5a1541f1aa526a95ab (diff)
downloadmullvadvpn-3a2e2fffdf3630102e5bcf0bcf60076057a98b65.tar.xz
mullvadvpn-3a2e2fffdf3630102e5bcf0bcf60076057a98b65.zip
Stop proxy monitor when dropped
Diffstat (limited to 'talpid-core/src')
-rw-r--r--talpid-core/src/proxy/shadowsocks.rs40
1 files changed, 25 insertions, 15 deletions
diff --git a/talpid-core/src/proxy/shadowsocks.rs b/talpid-core/src/proxy/shadowsocks.rs
index 17d381d9bc..54efbe1205 100644
--- a/talpid-core/src/proxy/shadowsocks.rs
+++ b/talpid-core/src/proxy/shadowsocks.rs
@@ -20,7 +20,7 @@ use talpid_types::{net::openvpn::ShadowsocksProxySettings, ErrorExt};
pub struct ShadowsocksProxyMonitor {
port: u16,
- server_join_handle: JoinHandle<Result<io::Result<()>, Aborted>>,
+ server_join_handle: Option<JoinHandle<Result<io::Result<()>, Aborted>>>,
server_abort_handle: AbortHandle,
}
@@ -93,12 +93,18 @@ impl ShadowsocksProxyMonitor {
Ok(Self {
port: bound_addr.port(),
- server_join_handle,
+ server_join_handle: Some(server_join_handle),
server_abort_handle,
})
}
}
+impl Drop for ShadowsocksProxyMonitor {
+ fn drop(&mut self) {
+ self.server_abort_handle.abort();
+ }
+}
+
#[async_trait]
impl ProxyMonitor for ShadowsocksProxyMonitor {
fn close_handle(&mut self) -> Box<dyn ProxyMonitorCloseHandle> {
@@ -108,21 +114,25 @@ impl ProxyMonitor for ShadowsocksProxyMonitor {
}
async fn wait(mut self: Box<Self>) -> super::Result<()> {
- match self.server_join_handle.await {
- Ok(Err(Aborted)) => Ok(()),
+ if let Some(join_handle) = self.server_join_handle.take() {
+ match join_handle.await {
+ Ok(Err(Aborted)) => Ok(()),
- Err(join_err) if join_err.is_cancelled() => Ok(()),
- Err(_) => Err(Error::UnexpectedExit(
- "Shadowsocks task panicked".to_string(),
- )),
+ Err(join_err) if join_err.is_cancelled() => Ok(()),
+ Err(_) => Err(Error::UnexpectedExit(
+ "Shadowsocks task panicked".to_string(),
+ )),
- Ok(Ok(result)) => match result {
- Ok(()) => Err(Error::UnexpectedExit("Exited without error".to_string())),
- Err(error) => Err(Error::UnexpectedExit(format!(
- "Error: {}",
- error.display_chain()
- ))),
- },
+ Ok(Ok(result)) => match result {
+ Ok(()) => Err(Error::UnexpectedExit("Exited without error".to_string())),
+ Err(error) => Err(Error::UnexpectedExit(format!(
+ "Error: {}",
+ error.display_chain()
+ ))),
+ },
+ }
+ } else {
+ Ok(())
}
}