diff options
| author | David Lönnhager <david.l@mullvad.net> | 2022-04-01 14:39:19 +0200 |
|---|---|---|
| committer | David Lönnhager <david.l@mullvad.net> | 2022-04-05 10:34:01 +0200 |
| commit | 3a2e2fffdf3630102e5bcf0bcf60076057a98b65 (patch) | |
| tree | 059d50444cd7e48cc28a54bf05fc6e7ffaf8d0c2 /talpid-core/src | |
| parent | 5e3dd68495073a6a4b00ae5a1541f1aa526a95ab (diff) | |
| download | mullvadvpn-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.rs | 40 |
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(()) } } |
