summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorLinus Färnstrand <linus@mullvad.net>2023-05-24 13:06:30 +0200
committerLinus Färnstrand <linus@mullvad.net>2023-05-24 13:06:30 +0200
commit292635f2f8a9df2163fa3827eb2cfc21ac60364d (patch)
tree001fe5bc0ab88bb07fe3cc21ce218af28dfc72ba
parent0cd73c2ce02d8a57ea2580951cd9a628e540f591 (diff)
parent73134d2527df2492f7f115bdf305bc1e4b800a71 (diff)
downloadmullvadvpn-292635f2f8a9df2163fa3827eb2cfc21ac60364d.tar.xz
mullvadvpn-292635f2f8a9df2163fa3827eb2cfc21ac60364d.zip
Merge branch 'fix-android-clippy-warnings'
-rw-r--r--.github/workflows/clippy.yml50
-rw-r--r--mullvad-api/src/https_client_with_sni.rs2
-rw-r--r--mullvad-daemon/src/api.rs5
-rw-r--r--mullvad-jni/src/daemon_interface.rs34
-rw-r--r--mullvad-jni/src/jni_event_listener.rs2
-rw-r--r--mullvad-jni/src/lib.rs166
-rw-r--r--mullvad-jni/src/talpid_vpn_service.rs6
-rw-r--r--talpid-core/src/offline/android.rs2
-rw-r--r--talpid-routing/src/lib.rs3
-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.rs4
-rw-r--r--talpid-wireguard/src/ping_monitor/android.rs2
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()