diff options
| author | Jon Petersson <jon.petersson@mullvad.net> | 2025-06-25 14:43:35 +0200 |
|---|---|---|
| committer | Jon Petersson <jon.petersson@mullvad.net> | 2025-07-08 12:04:35 +0200 |
| commit | 7ded39e1f58396baa401b93576dd4650e0836645 (patch) | |
| tree | e275fbf4cd1a23ea38bef30e45f87c233e5c3c72 /mullvad-ios/src/api_client | |
| parent | 216653151569b218ca8f0d78a8585595147a16b9 (diff) | |
| download | mullvadvpn-7ded39e1f58396baa401b93576dd4650e0836645.tar.xz mullvadvpn-7ded39e1f58396baa401b93576dd4650e0836645.zip | |
Update FFI to handle new QUIC params
Diffstat (limited to 'mullvad-ios/src/api_client')
| -rw-r--r-- | mullvad-ios/src/api_client/access_method_settings.rs | 6 | ||||
| -rw-r--r-- | mullvad-ios/src/api_client/address_cache_provider.rs | 5 | ||||
| -rw-r--r-- | mullvad-ios/src/api_client/helpers.rs | 22 | ||||
| -rw-r--r-- | mullvad-ios/src/api_client/mod.rs | 33 | ||||
| -rw-r--r-- | mullvad-ios/src/api_client/storekit.rs | 9 |
5 files changed, 24 insertions, 51 deletions
diff --git a/mullvad-ios/src/api_client/access_method_settings.rs b/mullvad-ios/src/api_client/access_method_settings.rs index 35a90d1f0c..2870047e24 100644 --- a/mullvad-ios/src/api_client/access_method_settings.rs +++ b/mullvad-ios/src/api_client/access_method_settings.rs @@ -11,7 +11,7 @@ use mullvad_types::access_method::{ }; use talpid_types::net::proxy::{self, Shadowsocks, Socks5Remote}; -use super::helpers::convert_c_string; +use crate::get_string; /// Converts parameters into a `Box<AccessMethodSetting>` raw representation that /// can be passed across the FFI boundary @@ -54,9 +54,9 @@ fn convert_builtin_access_method_setting_inner( proxy_configuration: *const c_void, ) -> Option<AccessMethodSetting> { // SAFETY: See `convert_builtin_access_method_setting` - let id = Id::from_string(unsafe { convert_c_string(unique_identifier) })?; + let id = unsafe { Id::from_string(get_string(unique_identifier))? }; // SAFETY: See `convert_builtin_access_method_setting` - let name = unsafe { convert_c_string(name) }; + let name = unsafe { get_string(name) }; match method_kind { SwiftAccessMethodKind::KindDirect => Some(AccessMethodSetting::with_id( id, diff --git a/mullvad-ios/src/api_client/address_cache_provider.rs b/mullvad-ios/src/api_client/address_cache_provider.rs index f813683445..9d5f656c62 100644 --- a/mullvad-ios/src/api_client/address_cache_provider.rs +++ b/mullvad-ios/src/api_client/address_cache_provider.rs @@ -1,7 +1,8 @@ -use super::helpers::convert_c_string; use libc::c_char; use std::{ffi::c_void, net::SocketAddr}; +use super::get_string; + extern "C" { /// Return the latest available endpoint, or a default one if none are cached /// @@ -58,7 +59,7 @@ impl SwiftAddressCacheProviderContext { // SAFETY: The pointer contained in the late deallocator returned by `swift_get_cached_endpoint` // is guaranteed to point to a valid UTF-8 String // It is also guaranteed to be a valid representation of either an IPv4 or IPv6 address - let cached_address = unsafe { convert_c_string(deallocator.ptr) } + let cached_address = unsafe { get_string(deallocator.ptr) } .parse() .expect("Invalid socket address in cache"); diff --git a/mullvad-ios/src/api_client/helpers.rs b/mullvad-ios/src/api_client/helpers.rs index f331e56a9b..556b679d71 100644 --- a/mullvad-ios/src/api_client/helpers.rs +++ b/mullvad-ios/src/api_client/helpers.rs @@ -1,10 +1,12 @@ use std::{ - ffi::{c_char, c_void, CStr}, + ffi::{c_char, c_void}, net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr}, }; use talpid_types::net::proxy::{Shadowsocks, Socks5Remote, SocksAuth}; +use super::get_string; + /// Constructs a new IP address from a pointer containing bytes representing an IP address. /// /// SAFETY: `addr` pointer must be non-null, aligned, and point to at least addr_len bytes @@ -30,16 +32,6 @@ pub(crate) unsafe fn parse_ip_addr(addr: *const u8, addr_len: usize) -> Option<I } } -/// Converts a pointer to a C style string into an owned Rust `String` -/// -/// # SAFETY -/// `c_str` must point to a valid, null terminated C string. -pub unsafe fn convert_c_string(c_str: *const c_char) -> String { - // SAFETY: c_str points to a valid region of memory and contains a null terminator. - let str = unsafe { CStr::from_ptr(c_str) }; - String::from_utf8_lossy(str.to_bytes()).into_owned() -} - /// Converts parameters into a boxed `Shadowsocks` configuration that is safe /// to send across the FFI boundary /// @@ -60,8 +52,8 @@ pub unsafe extern "C" fn new_shadowsocks_access_method_setting( return std::ptr::null(); }; - let password = convert_c_string(c_password); - let cipher = convert_c_string(c_cipher); + let password = get_string(c_password); + let cipher = get_string(c_cipher); let shadowsocks_configuration = Shadowsocks { endpoint, @@ -97,8 +89,8 @@ pub unsafe extern "C" fn new_socks5_access_method_setting( if c_username.is_null() || c_password.is_null() { None } else { - let username = convert_c_string(c_username); - let password = convert_c_string(c_password); + let username = get_string(c_username); + let password = get_string(c_password); SocksAuth::new(username, password).ok() } }; diff --git a/mullvad-ios/src/api_client/mod.rs b/mullvad-ios/src/api_client/mod.rs index 4e875fe4c6..1c45fb3397 100644 --- a/mullvad-ios/src/api_client/mod.rs +++ b/mullvad-ios/src/api_client/mod.rs @@ -1,9 +1,9 @@ -use std::{ffi::c_char, ffi::CStr, future::Future, sync::Arc}; +use std::{ffi::c_char, future::Future, sync::Arc}; +use crate::get_string; use access_method_resolver::SwiftAccessMethodResolver; use access_method_settings::SwiftAccessMethodSettingsWrapper; use address_cache_provider::SwiftAddressCacheWrapper; -use helpers::convert_c_string; use mullvad_api::{ access_mode::{AccessModeSelector, AccessModeSelectorHandle}, rest::{self, MullvadRestHandle}, @@ -108,8 +108,8 @@ pub unsafe extern "C" fn mullvad_api_use_access_method( access_method_id: *const c_char, ) { let api_context = api_context.rust_context(); - // SAFETY: See Safety notes for `convert_c_string` - let id = unsafe { convert_c_string(access_method_id) }; + // SAFETY: See Safety notes for `get_string` + let id = get_string(access_method_id); let Some(id) = Id::from_string(id) else { return; @@ -214,14 +214,9 @@ pub extern "C" fn mullvad_api_init_inner( settings_provider: SwiftAccessMethodSettingsWrapper, address_cache: SwiftAddressCacheWrapper, ) -> SwiftApiContext { - // Safety: See notes for `convert_c_string` - let (host, address, domain) = unsafe { - ( - convert_c_string(host), - convert_c_string(address), - convert_c_string(domain), - ) - }; + // Safety: See notes for `get_string` + let (host, address, domain) = + unsafe { (get_string(host), get_string(address), get_string(domain)) }; // The iOS client provides a different default endpoint based on its configuration // Debug and Release builds use the standard endpoints @@ -314,17 +309,3 @@ where retry_future(future_factory, should_retry, retry_strategy.delays()).await } - -/// Try to convert a C string to an owned [String]. if `ptr` is null, an empty [String] is -/// returned. -/// -/// # Safety -/// - `ptr` must uphold all safety invariants as required by [CStr::from_ptr]. -fn get_string(ptr: *const c_char) -> String { - if ptr.is_null() { - return String::new(); - } - // Safety: See function doc comment. - let cstr = unsafe { CStr::from_ptr(ptr) }; - cstr.to_str().map(ToOwned::to_owned).unwrap_or_default() -} diff --git a/mullvad-ios/src/api_client/storekit.rs b/mullvad-ios/src/api_client/storekit.rs index 61967eec9b..994e6628d7 100644 --- a/mullvad-ios/src/api_client/storekit.rs +++ b/mullvad-ios/src/api_client/storekit.rs @@ -9,8 +9,7 @@ use mullvad_types::account::AccountNumber; use super::{ cancellation::{RequestCancelHandle, SwiftCancelHandle}, completion::{CompletionCookie, SwiftCompletionHandler}, - do_request, - helpers::convert_c_string, + do_request, get_string, response::SwiftMullvadApiResponse, retry_strategy::{RetryStrategy, SwiftRetryStrategy}, SwiftApiContext, @@ -58,7 +57,7 @@ pub unsafe extern "C" fn mullvad_ios_legacy_storekit_payment( let completion = completion_handler.clone(); // SAFETY: See param documentation for `account_number`. - let account_number = unsafe { AccountNumber::from(convert_c_string(account_number)) }; + let account_number = AccountNumber::from(get_string(account_number)); // SAFETY: See param documentation for `body`. let body = unsafe { std::slice::from_raw_parts(body, body_size) }.to_vec(); @@ -133,7 +132,7 @@ pub unsafe extern "C" fn mullvad_ios_init_storekit_payment( let completion = completion_handler.clone(); // SAFETY: See param documentation for `account_number`. - let account_number = unsafe { AccountNumber::from(convert_c_string(account_number)) }; + let account_number = AccountNumber::from(get_string(account_number)); let task = tokio_handle.spawn(async move { match mullvad_ios_init_storekit_payment_inner( @@ -208,7 +207,7 @@ pub unsafe extern "C" fn mullvad_ios_check_storekit_payment( let completion = completion_handler.clone(); // SAFETY: See param documentation for `account_number`. - let account_number = unsafe { AccountNumber::from(convert_c_string(account_number)) }; + let account_number = AccountNumber::from(get_string(account_number)); // SAFETY: See param documentation for `body`. let body = unsafe { std::slice::from_raw_parts(body, body_size) }.to_vec(); |
