diff options
| author | Linus Färnstrand <linus@mullvad.net> | 2023-05-24 13:06:30 +0200 |
|---|---|---|
| committer | Linus Färnstrand <linus@mullvad.net> | 2023-05-24 13:06:30 +0200 |
| commit | 292635f2f8a9df2163fa3827eb2cfc21ac60364d (patch) | |
| tree | 001fe5bc0ab88bb07fe3cc21ce218af28dfc72ba | |
| parent | 0cd73c2ce02d8a57ea2580951cd9a628e540f591 (diff) | |
| parent | 73134d2527df2492f7f115bdf305bc1e4b800a71 (diff) | |
| download | mullvadvpn-292635f2f8a9df2163fa3827eb2cfc21ac60364d.tar.xz mullvadvpn-292635f2f8a9df2163fa3827eb2cfc21ac60364d.zip | |
Merge branch 'fix-android-clippy-warnings'
| -rw-r--r-- | .github/workflows/clippy.yml | 50 | ||||
| -rw-r--r-- | mullvad-api/src/https_client_with_sni.rs | 2 | ||||
| -rw-r--r-- | mullvad-daemon/src/api.rs | 5 | ||||
| -rw-r--r-- | mullvad-jni/src/daemon_interface.rs | 34 | ||||
| -rw-r--r-- | mullvad-jni/src/jni_event_listener.rs | 2 | ||||
| -rw-r--r-- | mullvad-jni/src/lib.rs | 166 | ||||
| -rw-r--r-- | mullvad-jni/src/talpid_vpn_service.rs | 6 | ||||
| -rw-r--r-- | talpid-core/src/offline/android.rs | 2 | ||||
| -rw-r--r-- | talpid-routing/src/lib.rs | 3 | ||||
| -rw-r--r-- | talpid-routing/src/unix/android.rs (renamed from talpid-routing/src/android.rs) | 1 | ||||
| -rw-r--r-- | talpid-routing/src/unix/linux.rs (renamed from talpid-routing/src/linux.rs) | 0 | ||||
| -rw-r--r-- | talpid-routing/src/unix/macos.rs (renamed from talpid-routing/src/macos.rs) | 11 | ||||
| -rw-r--r-- | talpid-routing/src/unix/mod.rs (renamed from talpid-routing/src/unix.rs) | 19 | ||||
| -rw-r--r-- | talpid-tunnel/src/tun_provider/android/mod.rs | 4 | ||||
| -rw-r--r-- | talpid-wireguard/src/ping_monitor/android.rs | 2 |
15 files changed, 195 insertions, 112 deletions
diff --git a/.github/workflows/clippy.yml b/.github/workflows/clippy.yml index 8d55bd2c05..31f97881ee 100644 --- a/.github/workflows/clippy.yml +++ b/.github/workflows/clippy.yml @@ -8,7 +8,28 @@ on: - '**/*.rs' workflow_dispatch: jobs: - clippy_check: + prepare-android: + name: Prepare Android container + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Use custom container image if specified + if: ${{ github.event.inputs.override_container_image != '' }} + run: echo "inner_container_image_android=${{ github.event.inputs.override_container_image }}" + >> $GITHUB_ENV + + - name: Use default container image and resolve digest + if: ${{ github.event.inputs.override_container_image == '' }} + run: | + echo "inner_container_image_android=$(cat ./building/android-container-image.txt)" >> $GITHUB_ENV + + outputs: + container_image_android: ${{ env.inner_container_image_android }} + + clippy-check-desktop: + name: Clippy linting, desktop strategy: matrix: os: [ubuntu-latest, windows-latest, macos-latest] @@ -39,7 +60,30 @@ jobs: - name: Clippy check shell: bash - run: |- - export RUSTFLAGS="--deny warnings" + env: + RUSTFLAGS: --deny warnings + run: | source env.sh time cargo clippy --locked -- -W clippy::unused_async + + clippy-check-android: + name: Clippy linting, Android + needs: prepare-android + runs-on: ubuntu-latest + container: + image: ${{ needs.prepare-android.outputs.container_image_android }} + + steps: + # Fix for HOME path overridden by GH runners when building in containers, see: + # https://github.com/actions/runner/issues/863 + - name: Fix HOME path + run: echo "HOME=/root" >> $GITHUB_ENV + + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Clippy check + env: + RUSTFLAGS: --deny warnings + run: | + cargo clippy --locked --target x86_64-linux-android --package mullvad-jni -- -W clippy::unused_async diff --git a/mullvad-api/src/https_client_with_sni.rs b/mullvad-api/src/https_client_with_sni.rs index dbe71203ec..e8f7fb889c 100644 --- a/mullvad-api/src/https_client_with_sni.rs +++ b/mullvad-api/src/https_client_with_sni.rs @@ -207,7 +207,7 @@ impl HttpsConnectorWithSni { if let Some(mut tx) = socket_bypass_tx { let (done_tx, done_rx) = oneshot::channel(); let _ = tx.send((socket.as_raw_fd(), done_tx)).await; - if let Err(_) = done_rx.await { + if done_rx.await.is_err() { log::error!("Failed to bypass socket, connection might fail"); } } diff --git a/mullvad-daemon/src/api.rs b/mullvad-daemon/src/api.rs index fe718c441a..67f80ca235 100644 --- a/mullvad-daemon/src/api.rs +++ b/mullvad-daemon/src/api.rs @@ -205,7 +205,10 @@ pub(crate) fn create_bypass_tx( let daemon_tx = event_sender.to_specialized_sender(); tokio::spawn(async move { while let Some((raw_fd, done_tx)) = bypass_rx.next().await { - if let Err(_) = daemon_tx.send(DaemonCommand::BypassSocket(raw_fd, done_tx)) { + if daemon_tx + .send(DaemonCommand::BypassSocket(raw_fd, done_tx)) + .is_err() + { log::error!("Can't send socket bypass request to daemon"); break; } diff --git a/mullvad-jni/src/daemon_interface.rs b/mullvad-jni/src/daemon_interface.rs index ca4c27fb25..78e50c3d86 100644 --- a/mullvad-jni/src/daemon_interface.rs +++ b/mullvad-jni/src/daemon_interface.rs @@ -25,10 +25,10 @@ pub enum Error { NoSender, #[error(display = "Error performing RPC with the remote API")] - RpcError(#[error(source)] mullvad_api::rest::Error), + Api(#[error(source)] mullvad_api::rest::Error), #[error(display = "Failed to update settings")] - SettingsError, + UpdateSettings, #[error(display = "Daemon returned an error")] OtherError(#[error(source)] mullvad_daemon::Error), @@ -37,12 +37,12 @@ pub enum Error { impl From<mullvad_daemon::Error> for Error { fn from(error: mullvad_daemon::Error) -> Error { match error { - mullvad_daemon::Error::RestError(error) => Error::RpcError(error), + mullvad_daemon::Error::RestError(error) => Error::Api(error), mullvad_daemon::Error::LoginError(device::Error::OtherRestError(error)) => { - Error::RpcError(error) + Error::Api(error) } mullvad_daemon::Error::ListDevicesError(device::Error::OtherRestError(error)) => { - Error::RpcError(error) + Error::Api(error) } error => Error::OtherError(error), } @@ -93,7 +93,7 @@ impl DaemonInterface { block_on(rx) .map_err(|_| Error::NoResponse)? - .map_err(Error::RpcError) + .map_err(Error::Api) } pub fn get_account_history(&self) -> Result<Option<AccountToken>> { @@ -119,7 +119,7 @@ impl DaemonInterface { self.send_command(DaemonCommand::GetCurrentLocation(tx))?; - Ok(block_on(rx).map_err(|_| Error::NoResponse)?) + block_on(rx).map_err(|_| Error::NoResponse) } pub fn get_current_version(&self) -> Result<String> { @@ -127,7 +127,7 @@ impl DaemonInterface { self.send_command(DaemonCommand::GetCurrentVersion(tx))?; - Ok(block_on(rx).map_err(|_| Error::NoResponse)?) + block_on(rx).map_err(|_| Error::NoResponse) } pub fn get_relay_locations(&self) -> Result<RelayList> { @@ -135,7 +135,7 @@ impl DaemonInterface { self.send_command(DaemonCommand::GetRelayLocations(tx))?; - Ok(block_on(rx).map_err(|_| Error::NoResponse)?) + block_on(rx).map_err(|_| Error::NoResponse) } pub fn get_settings(&self) -> Result<Settings> { @@ -143,7 +143,7 @@ impl DaemonInterface { self.send_command(DaemonCommand::GetSettings(tx))?; - Ok(block_on(rx).map_err(|_| Error::NoResponse)?) + block_on(rx).map_err(|_| Error::NoResponse) } pub fn get_state(&self) -> Result<TunnelState> { @@ -151,7 +151,7 @@ impl DaemonInterface { self.send_command(DaemonCommand::GetState(tx))?; - Ok(block_on(rx).map_err(|_| Error::NoResponse)?) + block_on(rx).map_err(|_| Error::NoResponse) } pub fn get_version_info(&self) -> Result<AppVersionInfo> { @@ -259,7 +259,7 @@ impl DaemonInterface { block_on(rx) .map_err(|_| Error::NoResponse)? - .map_err(|_| Error::SettingsError) + .map_err(|_| Error::UpdateSettings) } pub fn set_auto_connect(&self, auto_connect: bool) -> Result<()> { @@ -269,7 +269,7 @@ impl DaemonInterface { block_on(rx) .map_err(|_| Error::NoResponse)? - .map_err(|_| Error::SettingsError) + .map_err(|_| Error::UpdateSettings) } pub fn set_dns_options(&self, dns_options: DnsOptions) -> Result<()> { @@ -279,7 +279,7 @@ impl DaemonInterface { block_on(rx) .map_err(|_| Error::NoResponse)? - .map_err(|_| Error::SettingsError) + .map_err(|_| Error::UpdateSettings) } pub fn set_wireguard_mtu(&self, wireguard_mtu: Option<u16>) -> Result<()> { @@ -289,7 +289,7 @@ impl DaemonInterface { block_on(rx) .map_err(|_| Error::NoResponse)? - .map_err(|_| Error::SettingsError) + .map_err(|_| Error::UpdateSettings) } pub fn shutdown(&self) -> Result<()> { @@ -313,7 +313,7 @@ impl DaemonInterface { block_on(rx) .map_err(|_| Error::NoResponse)? - .map_err(|_| Error::SettingsError) + .map_err(|_| Error::UpdateSettings) } pub fn set_obfuscation_settings(&self, settings: ObfuscationSettings) -> Result<()> { @@ -323,7 +323,7 @@ impl DaemonInterface { block_on(rx) .map_err(|_| Error::NoResponse)? - .map_err(|_| Error::SettingsError) + .map_err(|_| Error::UpdateSettings) } fn send_command(&self, command: DaemonCommand) -> Result<()> { diff --git a/mullvad-jni/src/jni_event_listener.rs b/mullvad-jni/src/jni_event_listener.rs index 553f3f48f3..4e1dcff630 100644 --- a/mullvad-jni/src/jni_event_listener.rs +++ b/mullvad-jni/src/jni_event_listener.rs @@ -98,7 +98,7 @@ impl JniEventHandler<'_> { thread::spawn(move || match jvm.attach_current_thread() { Ok(attach_guard) => { - let env = JnixEnv::from(attach_guard.clone()); + let env = JnixEnv::from(*attach_guard); match JniEventHandler::new(env, mullvad_ipc_client.as_obj(), rx) { Ok(mut listener) => listener.run(), diff --git a/mullvad-jni/src/lib.rs b/mullvad-jni/src/lib.rs index 35db9a6766..cb8ddb9e5f 100644 --- a/mullvad-jni/src/lib.rs +++ b/mullvad-jni/src/lib.rs @@ -30,7 +30,6 @@ use mullvad_types::{ use std::{ io, path::{Path, PathBuf}, - ptr, sync::{ atomic::{AtomicUsize, Ordering}, mpsc, Arc, Once, @@ -82,12 +81,12 @@ impl From<Result<AccountData, daemon_interface::Error>> for GetAccountDataResult match result { Ok(account_data) => GetAccountDataResult::Ok(account_data), Err(error) => match error { - daemon_interface::Error::RpcError(RestError::ApiError(status, _code)) + daemon_interface::Error::Api(RestError::ApiError(status, _code)) if status == StatusCode::UNAUTHORIZED || status == StatusCode::FORBIDDEN => { GetAccountDataResult::InvalidAccount } - daemon_interface::Error::RpcError(_) => GetAccountDataResult::RpcError, + daemon_interface::Error::Api(_) => GetAccountDataResult::RpcError, _ => GetAccountDataResult::OtherError, }, } @@ -117,7 +116,7 @@ impl From<Result<(), daemon_interface::Error>> for LoginResult { _ => LoginResult::OtherError, } } - daemon_interface::Error::RpcError(_) => LoginResult::RpcError, + daemon_interface::Error::Api(_) => LoginResult::RpcError, _ => LoginResult::OtherError, }, } @@ -146,7 +145,7 @@ impl From<Result<(), daemon_interface::Error>> for RemoveDeviceResult { _ => RemoveDeviceResult::OtherError, } } - daemon_interface::Error::RpcError(_) => RemoveDeviceResult::RpcError, + daemon_interface::Error::Api(_) => RemoveDeviceResult::RpcError, _ => RemoveDeviceResult::OtherError, }, } @@ -181,14 +180,12 @@ impl From<Result<VoucherSubmission, daemon_interface::Error>> for VoucherSubmiss impl From<daemon_interface::Error> for VoucherSubmissionError { fn from(error: daemon_interface::Error) -> Self { match error { - daemon_interface::Error::RpcError(RestError::ApiError(_, code)) => { - match code.as_str() { - mullvad_api::INVALID_VOUCHER => VoucherSubmissionError::InvalidVoucher, - mullvad_api::VOUCHER_USED => VoucherSubmissionError::VoucherAlreadyUsed, - _ => VoucherSubmissionError::RpcError, - } - } - daemon_interface::Error::RpcError(_) => VoucherSubmissionError::RpcError, + daemon_interface::Error::Api(RestError::ApiError(_, code)) => match code.as_str() { + mullvad_api::INVALID_VOUCHER => VoucherSubmissionError::InvalidVoucher, + mullvad_api::VOUCHER_USED => VoucherSubmissionError::VoucherAlreadyUsed, + _ => VoucherSubmissionError::RpcError, + }, + daemon_interface::Error::Api(_) => VoucherSubmissionError::RpcError, _ => VoucherSubmissionError::OtherError, } } @@ -559,16 +556,22 @@ pub extern "system" fn Java_net_mullvad_mullvadvpn_service_MullvadDaemon_deiniti set_daemon_interface_address(&env, &this, 0); - if daemon_interface_address != ptr::null_mut() { + if !daemon_interface_address.is_null() { let _ = unsafe { Box::from_raw(daemon_interface_address) }; } } -fn get_daemon_interface<'a>(address: jlong) -> Option<&'a mut DaemonInterface> { +/// # Safety +/// +/// `address` must either be zero or a valid pointer to a `DaemonInterface` instance. +/// This function has no concept of lifetimes, so the caller must ensure that the +/// pointed to `DaemonInterface` is valid for at least as long as the return value +/// of this function is still alive. +unsafe fn get_daemon_interface(address: jlong) -> Option<&'static mut DaemonInterface> { let pointer = address as *mut DaemonInterface; - if pointer != ptr::null_mut() { - Some(Box::leak(unsafe { Box::from_raw(pointer) })) + if !pointer.is_null() { + Some(&mut *pointer) } else { log::error!("Attempt to get daemon interface while it is null"); None @@ -582,7 +585,8 @@ pub extern "system" fn Java_net_mullvad_mullvadvpn_service_MullvadDaemon_connect _: JObject<'_>, daemon_interface_address: jlong, ) { - if let Some(daemon_interface) = get_daemon_interface(daemon_interface_address) { + // SAFETY: The address points to an instance valid for the duration of this function call + if let Some(daemon_interface) = unsafe { get_daemon_interface(daemon_interface_address) } { if let Err(error) = daemon_interface.connect() { log::error!( "{}", @@ -601,7 +605,8 @@ pub extern "system" fn Java_net_mullvad_mullvadvpn_service_MullvadDaemon_createN ) -> JObject<'env> { let env = JnixEnv::from(env); - if let Some(daemon_interface) = get_daemon_interface(daemon_interface_address) { + // SAFETY: The address points to an instance valid for the duration of this function call + if let Some(daemon_interface) = unsafe { get_daemon_interface(daemon_interface_address) } { match daemon_interface.create_new_account() { Ok(account) => account.into_java(&env).forget(), Err(error) => { @@ -621,7 +626,8 @@ pub extern "system" fn Java_net_mullvad_mullvadvpn_service_MullvadDaemon_disconn _: JObject<'_>, daemon_interface_address: jlong, ) { - if let Some(daemon_interface) = get_daemon_interface(daemon_interface_address) { + // SAFETY: The address points to an instance valid for the duration of this function call + if let Some(daemon_interface) = unsafe { get_daemon_interface(daemon_interface_address) } { if let Err(error) = daemon_interface.disconnect() { log::error!( "{}", @@ -640,7 +646,8 @@ pub extern "system" fn Java_net_mullvad_mullvadvpn_service_MullvadDaemon_getAcco ) -> JObject<'env> { let env = JnixEnv::from(env); - match get_daemon_interface(daemon_interface_address) { + // SAFETY: The address points to an instance valid for the duration of this function call + match unsafe { get_daemon_interface(daemon_interface_address) } { Some(daemon_interface) => daemon_interface .get_account_history() .map(|history| history.into_java(&env).forget()) @@ -659,7 +666,8 @@ pub extern "system" fn Java_net_mullvad_mullvadvpn_service_MullvadDaemon_getAcco ) -> JObject<'env> { let env = JnixEnv::from(env); - if let Some(daemon_interface) = get_daemon_interface(daemon_interface_address) { + // SAFETY: The address points to an instance valid for the duration of this function call + if let Some(daemon_interface) = unsafe { get_daemon_interface(daemon_interface_address) } { let account = String::from_java(&env, accountToken); let result = daemon_interface.get_account_data(account); @@ -682,7 +690,8 @@ pub extern "system" fn Java_net_mullvad_mullvadvpn_service_MullvadDaemon_getWwwA ) -> JObject<'env> { let env = JnixEnv::from(env); - if let Some(daemon_interface) = get_daemon_interface(daemon_interface_address) { + // SAFETY: The address points to an instance valid for the duration of this function call + if let Some(daemon_interface) = unsafe { get_daemon_interface(daemon_interface_address) } { match daemon_interface.get_www_auth_token() { Ok(token) => token.into_java(&env).forget(), Err(error) => { @@ -706,7 +715,8 @@ pub extern "system" fn Java_net_mullvad_mullvadvpn_service_MullvadDaemon_getCurr ) -> JObject<'env> { let env = JnixEnv::from(env); - if let Some(daemon_interface) = get_daemon_interface(daemon_interface_address) { + // SAFETY: The address points to an instance valid for the duration of this function call + if let Some(daemon_interface) = unsafe { get_daemon_interface(daemon_interface_address) } { match daemon_interface.get_current_location() { Ok(location) => location.into_java(&env).forget(), Err(error) => { @@ -731,7 +741,8 @@ pub extern "system" fn Java_net_mullvad_mullvadvpn_service_MullvadDaemon_getCurr ) -> JObject<'env> { let env = JnixEnv::from(env); - if let Some(daemon_interface) = get_daemon_interface(daemon_interface_address) { + // SAFETY: The address points to an instance valid for the duration of this function call + if let Some(daemon_interface) = unsafe { get_daemon_interface(daemon_interface_address) } { match daemon_interface.get_current_version() { Ok(version) => version.into_java(&env).forget(), Err(error) => { @@ -756,7 +767,8 @@ pub extern "system" fn Java_net_mullvad_mullvadvpn_service_MullvadDaemon_getRela ) -> JObject<'env> { let env = JnixEnv::from(env); - if let Some(daemon_interface) = get_daemon_interface(daemon_interface_address) { + // SAFETY: The address points to an instance valid for the duration of this function call + if let Some(daemon_interface) = unsafe { get_daemon_interface(daemon_interface_address) } { match daemon_interface.get_relay_locations() { Ok(relay_list) => relay_list.into_java(&env).forget(), Err(error) => { @@ -781,7 +793,8 @@ pub extern "system" fn Java_net_mullvad_mullvadvpn_service_MullvadDaemon_getSett ) -> JObject<'env> { let env = JnixEnv::from(env); - if let Some(daemon_interface) = get_daemon_interface(daemon_interface_address) { + // SAFETY: The address points to an instance valid for the duration of this function call + if let Some(daemon_interface) = unsafe { get_daemon_interface(daemon_interface_address) } { match daemon_interface.get_settings() { Ok(settings) => settings.into_java(&env).forget(), Err(error) => { @@ -803,7 +816,8 @@ pub extern "system" fn Java_net_mullvad_mullvadvpn_service_MullvadDaemon_getStat ) -> JObject<'env> { let env = JnixEnv::from(env); - if let Some(daemon_interface) = get_daemon_interface(daemon_interface_address) { + // SAFETY: The address points to an instance valid for the duration of this function call + if let Some(daemon_interface) = unsafe { get_daemon_interface(daemon_interface_address) } { match daemon_interface.get_state() { Ok(state) => state.into_java(&env).forget(), Err(error) => { @@ -825,7 +839,8 @@ pub extern "system" fn Java_net_mullvad_mullvadvpn_service_MullvadDaemon_getVers ) -> JObject<'env> { let env = JnixEnv::from(env); - if let Some(daemon_interface) = get_daemon_interface(daemon_interface_address) { + // SAFETY: The address points to an instance valid for the duration of this function call + if let Some(daemon_interface) = unsafe { get_daemon_interface(daemon_interface_address) } { match daemon_interface.get_version_info() { Ok(version_info) => version_info.into_java(&env).forget(), Err(error) => { @@ -850,7 +865,8 @@ pub extern "system" fn Java_net_mullvad_mullvadvpn_service_MullvadDaemon_getWire ) -> JObject<'env> { let env = JnixEnv::from(env); - if let Some(daemon_interface) = get_daemon_interface(daemon_interface_address) { + // SAFETY: The address points to an instance valid for the duration of this function call + if let Some(daemon_interface) = unsafe { get_daemon_interface(daemon_interface_address) } { match daemon_interface.get_wireguard_key() { Ok(key) => key.into_java(&env).forget(), Err(error) => { @@ -873,7 +889,8 @@ pub extern "system" fn Java_net_mullvad_mullvadvpn_service_MullvadDaemon_reconne _: JObject<'_>, daemon_interface_address: jlong, ) { - if let Some(daemon_interface) = get_daemon_interface(daemon_interface_address) { + // SAFETY: The address points to an instance valid for the duration of this function call + if let Some(daemon_interface) = unsafe { get_daemon_interface(daemon_interface_address) } { if let Err(error) = daemon_interface.reconnect() { log::error!( "{}", @@ -890,7 +907,8 @@ pub extern "system" fn Java_net_mullvad_mullvadvpn_service_MullvadDaemon_clearAc _: JObject<'_>, daemon_interface_address: jlong, ) { - if let Some(daemon_interface) = get_daemon_interface(daemon_interface_address) { + // SAFETY: The address points to an instance valid for the duration of this function call + if let Some(daemon_interface) = unsafe { get_daemon_interface(daemon_interface_address) } { if let Err(error) = daemon_interface.clear_account_history() { log::error!( "{}", @@ -910,7 +928,8 @@ pub extern "system" fn Java_net_mullvad_mullvadvpn_service_MullvadDaemon_loginAc ) -> JObject<'env> { let env = JnixEnv::from(env); - if let Some(daemon_interface) = get_daemon_interface(daemon_interface_address) { + // SAFETY: The address points to an instance valid for the duration of this function call + if let Some(daemon_interface) = unsafe { get_daemon_interface(daemon_interface_address) } { let account = String::from_java(&env, accountToken); let result = daemon_interface.login_account(account); @@ -931,7 +950,8 @@ pub extern "system" fn Java_net_mullvad_mullvadvpn_service_MullvadDaemon_logoutA _: JObject<'_>, daemon_interface_address: jlong, ) { - if let Some(daemon_interface) = get_daemon_interface(daemon_interface_address) { + // SAFETY: The address points to an instance valid for the duration of this function call + if let Some(daemon_interface) = unsafe { get_daemon_interface(daemon_interface_address) } { if let Err(error) = daemon_interface.logout_account() { log::error!("{}", error.display_chain_with_msg("Failed to log out")); } @@ -947,7 +967,8 @@ pub extern "system" fn Java_net_mullvad_mullvadvpn_service_MullvadDaemon_getDevi ) -> JObject<'env> { let env = JnixEnv::from(env); - if let Some(daemon_interface) = get_daemon_interface(daemon_interface_address) { + // SAFETY: The address points to an instance valid for the duration of this function call + if let Some(daemon_interface) = unsafe { get_daemon_interface(daemon_interface_address) } { match daemon_interface.get_device() { Ok(key) => key.into_java(&env).forget(), Err(error) => { @@ -967,7 +988,8 @@ pub extern "system" fn Java_net_mullvad_mullvadvpn_service_MullvadDaemon_updateD _: JObject<'_>, daemon_interface_address: jlong, ) { - if let Some(daemon_interface) = get_daemon_interface(daemon_interface_address) { + // SAFETY: The address points to an instance valid for the duration of this function call + if let Some(daemon_interface) = unsafe { get_daemon_interface(daemon_interface_address) } { if let Err(error) = daemon_interface.update_device() { log::error!( "{}", @@ -987,7 +1009,8 @@ pub extern "system" fn Java_net_mullvad_mullvadvpn_service_MullvadDaemon_listDev ) -> JObject<'env> { let env = JnixEnv::from(env); - if let Some(daemon_interface) = get_daemon_interface(daemon_interface_address) { + // SAFETY: The address points to an instance valid for the duration of this function call + if let Some(daemon_interface) = unsafe { get_daemon_interface(daemon_interface_address) } { let token = String::from_java(&env, account_token); match daemon_interface.list_devices(token) { Ok(key) => key.into_java(&env).forget(), @@ -1012,19 +1035,21 @@ pub extern "system" fn Java_net_mullvad_mullvadvpn_service_MullvadDaemon_removeD ) -> JObject<'env> { let env = JnixEnv::from(env); - let result = if let Some(daemon_interface) = get_daemon_interface(daemon_interface_address) { - let token = String::from_java(&env, account_token); - let device_id = String::from_java(&env, device_id); - let raw_result = daemon_interface.remove_device(token, device_id); + let result = + // SAFETY: The address points to an instance valid for the duration of this function call + if let Some(daemon_interface) = unsafe { get_daemon_interface(daemon_interface_address) } { + let token = String::from_java(&env, account_token); + let device_id = String::from_java(&env, device_id); + let raw_result = daemon_interface.remove_device(token, device_id); - if let Err(ref error) = &raw_result { - log_request_error("remove device", error); - } + if let Err(ref error) = &raw_result { + log_request_error("remove device", error); + } - RemoveDeviceResult::from(raw_result) - } else { - RemoveDeviceResult::OtherError - }; + RemoveDeviceResult::from(raw_result) + } else { + RemoveDeviceResult::OtherError + }; result.into_java(&env).forget() } @@ -1039,7 +1064,8 @@ pub extern "system" fn Java_net_mullvad_mullvadvpn_service_MullvadDaemon_setAllo ) { let env = JnixEnv::from(env); - if let Some(daemon_interface) = get_daemon_interface(daemon_interface_address) { + // SAFETY: The address points to an instance valid for the duration of this function call + if let Some(daemon_interface) = unsafe { get_daemon_interface(daemon_interface_address) } { let allow_lan = bool::from_java(&env, allow_lan); if let Err(error) = daemon_interface.set_allow_lan(allow_lan) { @@ -1061,7 +1087,8 @@ pub extern "system" fn Java_net_mullvad_mullvadvpn_service_MullvadDaemon_setAuto ) { let env = JnixEnv::from(env); - if let Some(daemon_interface) = get_daemon_interface(daemon_interface_address) { + // SAFETY: The address points to an instance valid for the duration of this function call + if let Some(daemon_interface) = unsafe { get_daemon_interface(daemon_interface_address) } { let auto_connect = bool::from_java(&env, auto_connect); if let Err(error) = daemon_interface.set_auto_connect(auto_connect) { @@ -1083,7 +1110,8 @@ pub extern "system" fn Java_net_mullvad_mullvadvpn_service_MullvadDaemon_setDnsO ) { let env = JnixEnv::from(env); - if let Some(daemon_interface) = get_daemon_interface(daemon_interface_address) { + // SAFETY: The address points to an instance valid for the duration of this function call + if let Some(daemon_interface) = unsafe { get_daemon_interface(daemon_interface_address) } { let dns_options = DnsOptions::from_java(&env, dnsOptions); if let Err(error) = daemon_interface.set_dns_options(dns_options) { @@ -1105,7 +1133,8 @@ pub extern "system" fn Java_net_mullvad_mullvadvpn_service_MullvadDaemon_setWire ) { let env = JnixEnv::from(env); - if let Some(daemon_interface) = get_daemon_interface(daemon_interface_address) { + // SAFETY: The address points to an instance valid for the duration of this function call + if let Some(daemon_interface) = unsafe { get_daemon_interface(daemon_interface_address) } { let wireguard_mtu = Option::<i32>::from_java(&env, wireguard_mtu).map(|value| value as u16); if let Err(error) = daemon_interface.set_wireguard_mtu(wireguard_mtu) { @@ -1124,7 +1153,8 @@ pub extern "system" fn Java_net_mullvad_mullvadvpn_service_MullvadDaemon_shutdow _: JObject<'_>, daemon_interface_address: jlong, ) { - if let Some(daemon_interface) = get_daemon_interface(daemon_interface_address) { + // SAFETY: The address points to an instance valid for the duration of this function call + if let Some(daemon_interface) = unsafe { get_daemon_interface(daemon_interface_address) } { if let Err(error) = daemon_interface.shutdown() { log::error!( "{}", @@ -1144,18 +1174,20 @@ pub extern "system" fn Java_net_mullvad_mullvadvpn_service_MullvadDaemon_submitV ) -> JObject<'env> { let env = JnixEnv::from(env); - let result = if let Some(daemon_interface) = get_daemon_interface(daemon_interface_address) { - let voucher = String::from_java(&env, voucher); - let raw_result = daemon_interface.submit_voucher(voucher); + let result = + // SAFETY: The address points to an instance valid for the duration of this function call + if let Some(daemon_interface) = unsafe { get_daemon_interface(daemon_interface_address) } { + let voucher = String::from_java(&env, voucher); + let raw_result = daemon_interface.submit_voucher(voucher); - if let Err(ref error) = &raw_result { - log_request_error("submit voucher code", error); - } + if let Err(ref error) = &raw_result { + log_request_error("submit voucher code", error); + } - VoucherSubmissionResult::from(raw_result) - } else { - VoucherSubmissionResult::Error(VoucherSubmissionError::OtherError) - }; + VoucherSubmissionResult::from(raw_result) + } else { + VoucherSubmissionResult::Error(VoucherSubmissionError::OtherError) + }; result.into_java(&env).forget() } @@ -1170,7 +1202,8 @@ pub extern "system" fn Java_net_mullvad_mullvadvpn_service_MullvadDaemon_updateR ) { let env = JnixEnv::from(env); - if let Some(daemon_interface) = get_daemon_interface(daemon_interface_address) { + // SAFETY: The address points to an instance valid for the duration of this function call + if let Some(daemon_interface) = unsafe { get_daemon_interface(daemon_interface_address) } { let update = FromJava::from_java(&env, relaySettingsUpdate); if let Err(error) = daemon_interface.update_relay_settings(update) { @@ -1192,7 +1225,8 @@ pub extern "system" fn Java_net_mullvad_mullvadvpn_service_MullvadDaemon_setObfu ) { let env = JnixEnv::from(env); - if let Some(daemon_interface) = get_daemon_interface(daemon_interface_address) { + // SAFETY: The address points to an instance valid for the duration of this function call + if let Some(daemon_interface) = unsafe { get_daemon_interface(daemon_interface_address) } { let settings = FromJava::from_java(&env, obfuscationSettings); if let Err(error) = daemon_interface.set_obfuscation_settings(settings) { @@ -1206,7 +1240,7 @@ pub extern "system" fn Java_net_mullvad_mullvadvpn_service_MullvadDaemon_setObfu fn log_request_error(request: &str, error: &daemon_interface::Error) { match error { - daemon_interface::Error::RpcError(RestError::Aborted) => { + daemon_interface::Error::Api(RestError::Aborted) => { log::debug!("Request to {} cancelled", request); } error => { diff --git a/mullvad-jni/src/talpid_vpn_service.rs b/mullvad-jni/src/talpid_vpn_service.rs index 554313b8e4..ba4f8a3470 100644 --- a/mullvad-jni/src/talpid_vpn_service.rs +++ b/mullvad-jni/src/talpid_vpn_service.rs @@ -101,7 +101,7 @@ fn try_sending_random_udp(is_ipv6_enabled: bool) -> Result<(), SendRandomDataErr // pick any random route to select between Ipv4 and Ipv6 // TODO: if we are to allow LAN on Android by changing the routes that are stuffed in // TunConfig, then this should be revisited to be fair between IPv4 and IPv6 - let should_generate_ipv4 = is_ipv6_enabled == false || thread_rng().gen(); + let should_generate_ipv4 = !is_ipv6_enabled || thread_rng().gen(); let rand_port = thread_rng().gen(); let (local_addr, rand_dest_addr) = if should_generate_ipv4 || tried_ipv6 { @@ -109,7 +109,7 @@ fn try_sending_random_udp(is_ipv6_enabled: bool) -> Result<(), SendRandomDataErr thread_rng().fill(&mut ipv4_bytes); ( SocketAddr::new(Ipv4Addr::UNSPECIFIED.into(), 0), - SocketAddr::new(IpAddr::from(ipv4_bytes).into(), rand_port), + SocketAddr::new(IpAddr::from(ipv4_bytes), rand_port), ) } else { let mut ipv6_bytes = [0u8; 16]; @@ -117,7 +117,7 @@ fn try_sending_random_udp(is_ipv6_enabled: bool) -> Result<(), SendRandomDataErr thread_rng().fill(&mut ipv6_bytes); ( SocketAddr::new(Ipv6Addr::UNSPECIFIED.into(), 0), - SocketAddr::new(IpAddr::from(ipv6_bytes).into(), rand_port), + SocketAddr::new(IpAddr::from(ipv6_bytes), rand_port), ) }; diff --git a/talpid-core/src/offline/android.rs b/talpid-core/src/offline/android.rs index 9aa4e33e8a..de9708f096 100644 --- a/talpid-core/src/offline/android.rs +++ b/talpid-core/src/offline/android.rs @@ -100,6 +100,7 @@ impl MonitorHandle { }) } + #[allow(clippy::unused_async)] pub async fn host_is_offline(&self) -> bool { match self.get_is_connected() { Ok(is_connected) => !is_connected, @@ -209,6 +210,7 @@ unsafe fn get_sender_from_address(address: jlong) -> Box<Weak<UnboundedSender<bo Box::from_raw(address as *mut Weak<UnboundedSender<bool>>) } +#[allow(clippy::unused_async)] pub async fn spawn_monitor( sender: UnboundedSender<bool>, android_context: AndroidContext, diff --git a/talpid-routing/src/lib.rs b/talpid-routing/src/lib.rs index e7ba551b31..d8c65e80da 100644 --- a/talpid-routing/src/lib.rs +++ b/talpid-routing/src/lib.rs @@ -9,11 +9,12 @@ use std::{fmt, net::IpAddr}; #[cfg(target_os = "windows")] #[path = "windows/mod.rs"] mod imp; + #[cfg(target_os = "windows")] pub use imp::{get_best_default_route, CallbackHandle, EventType, InterfaceAndGateway}; #[cfg(not(target_os = "windows"))] -#[path = "unix.rs"] +#[path = "unix/mod.rs"] mod imp; #[cfg(target_os = "linux")] diff --git a/talpid-routing/src/android.rs b/talpid-routing/src/unix/android.rs index 332e2ca093..953f0901ca 100644 --- a/talpid-routing/src/android.rs +++ b/talpid-routing/src/unix/android.rs @@ -11,6 +11,7 @@ pub struct Error; pub struct RouteManagerImpl {} impl RouteManagerImpl { + #[allow(clippy::unused_async)] pub async fn new(_required_routes: HashSet<RequiredRoute>) -> Result<Self, Error> { Ok(RouteManagerImpl {}) } diff --git a/talpid-routing/src/linux.rs b/talpid-routing/src/unix/linux.rs index a642bf5e3d..a642bf5e3d 100644 --- a/talpid-routing/src/linux.rs +++ b/talpid-routing/src/unix/linux.rs diff --git a/talpid-routing/src/macos.rs b/talpid-routing/src/unix/macos.rs index 075fb35439..893416a699 100644 --- a/talpid-routing/src/macos.rs +++ b/talpid-routing/src/unix/macos.rs @@ -1,4 +1,5 @@ -use crate::{imp::RouteManagerCommand, NetNode, Node, RequiredRoute, Route}; +use super::RouteManagerCommand; +use crate::{NetNode, Node, RequiredRoute, Route}; use futures::{ channel::mpsc, @@ -298,6 +299,14 @@ fn ip_vers(prefix: IpNetwork) -> &'static str { } } +/// Returns a tuple containing a IPv4 and IPv6 default route nodes. +pub async fn get_default_routes() -> Result<(Option<Node>, Option<Node>)> { + futures::try_join!( + RouteManagerImpl::get_default_node(IpVersion::V4), + RouteManagerImpl::get_default_node(IpVersion::V6) + ) +} + /// Returns a stream that produces an item whenever a default route is either added or deleted from /// the routing table. pub fn listen_for_default_route_changes() -> Result<impl Stream<Item = std::io::Result<()>>> { diff --git a/talpid-routing/src/unix.rs b/talpid-routing/src/unix/mod.rs index 19edb2783e..822615d0f1 100644 --- a/talpid-routing/src/unix.rs +++ b/talpid-routing/src/unix/mod.rs @@ -1,6 +1,6 @@ -#![cfg_attr(target_os = "android", allow(dead_code))] -#![cfg_attr(target_os = "windows", allow(dead_code))] // TODO: remove the allow(dead_code) for android once it's up to scratch. +#![cfg_attr(target_os = "android", allow(dead_code))] + use super::RequiredRoute; #[cfg(target_os = "linux")] use super::Route; @@ -10,8 +10,6 @@ use futures::channel::{ oneshot, }; use std::{collections::HashSet, io}; -#[cfg(target_os = "macos")] -use talpid_types::net::IpVersion; #[cfg(target_os = "linux")] use futures::stream::Stream; @@ -23,8 +21,9 @@ use std::net::IpAddr; #[cfg(target_os = "macos")] #[path = "macos.rs"] mod imp; + #[cfg(target_os = "macos")] -pub use imp::listen_for_default_route_changes; +pub use imp::{get_default_routes, listen_for_default_route_changes}; #[allow(clippy::module_inception)] #[cfg(target_os = "linux")] @@ -301,13 +300,3 @@ impl Drop for RouteManager { self.runtime.clone().block_on(self.stop()); } } - -/// Returns a tuple containing a IPv4 and IPv6 default route nodes. -#[cfg(target_os = "macos")] -pub async fn get_default_routes() -> Result<(Option<super::Node>, Option<super::Node>), Error> { - use futures::TryFutureExt; - futures::try_join!( - imp::RouteManagerImpl::get_default_node(IpVersion::V4).map_err(Into::into), - imp::RouteManagerImpl::get_default_node(IpVersion::V6).map_err(Into::into) - ) -} diff --git a/talpid-tunnel/src/tun_provider/android/mod.rs b/talpid-tunnel/src/tun_provider/android/mod.rs index 1cb6a49de4..06ffac9aa9 100644 --- a/talpid-tunnel/src/tun_provider/android/mod.rs +++ b/talpid-tunnel/src/tun_provider/android/mod.rs @@ -280,7 +280,7 @@ impl AndroidTunProvider { let env = JnixEnv::from( self.jvm .attach_current_thread_as_daemon() - .map_err(|cause| Error::AttachJvmToThread(cause))?, + .map_err(Error::AttachJvmToThread)?, ); let create_tun_method = env .get_method_id(&self.class, "bypass", "(I)Z") @@ -351,7 +351,7 @@ impl VpnServiceTun { let env = JnixEnv::from( self.jvm .attach_current_thread_as_daemon() - .map_err(|cause| Error::AttachJvmToThread(cause))?, + .map_err(Error::AttachJvmToThread)?, ); let create_tun_method = env .get_method_id(&self.class, "bypass", "(I)Z") diff --git a/talpid-wireguard/src/ping_monitor/android.rs b/talpid-wireguard/src/ping_monitor/android.rs index 9263dbac79..036db93563 100644 --- a/talpid-wireguard/src/ping_monitor/android.rs +++ b/talpid-wireguard/src/ping_monitor/android.rs @@ -50,7 +50,7 @@ impl super::Pinger for Pinger { } fn reset(&mut self) { - let processes = std::mem::replace(&mut self.processes, vec![]); + let processes = std::mem::take(&mut self.processes); for proc in processes { if proc .try_wait() |
