summaryrefslogtreecommitdiffhomepage
path: root/android/lib
diff options
context:
space:
mode:
authorDavid Göransson <david.goransson@mullvad.net>2024-09-06 16:02:17 +0200
committerDavid Göransson <david.goransson@mullvad.net>2024-09-06 16:02:17 +0200
commitb10d43a7546215b7e6d4f2a07f57398d818c68e0 (patch)
tree132784af66b606a0e65a66482c5de7d8e851c7cb /android/lib
parent17788c6ab46aef57eddc87f7eefd5a1f65a4683c (diff)
parent4c711955d02ef6847dd3c8a5906657698c8a9ce9 (diff)
downloadmullvadvpn-b10d43a7546215b7e6d4f2a07f57398d818c68e0.tar.xz
mullvadvpn-b10d43a7546215b7e6d4f2a07f57398d818c68e0.zip
Merge branch 'trycatch-establish-in-createtun-droid-1300'
Diffstat (limited to 'android/lib')
-rw-r--r--android/lib/talpid/src/main/kotlin/net/mullvad/talpid/TalpidVpnService.kt31
1 files changed, 22 insertions, 9 deletions
diff --git a/android/lib/talpid/src/main/kotlin/net/mullvad/talpid/TalpidVpnService.kt b/android/lib/talpid/src/main/kotlin/net/mullvad/talpid/TalpidVpnService.kt
index 1c4b51a520..cf8a775e13 100644
--- a/android/lib/talpid/src/main/kotlin/net/mullvad/talpid/TalpidVpnService.kt
+++ b/android/lib/talpid/src/main/kotlin/net/mullvad/talpid/TalpidVpnService.kt
@@ -85,7 +85,7 @@ open class TalpidVpnService : LifecycleVpnService() {
val builder =
Builder().apply {
for (address in config.addresses) {
- addAddress(address, prefixForAddress(address))
+ addAddress(address, address.prefixLength())
}
for (dnsServer in config.dnsServers) {
@@ -117,13 +117,24 @@ open class TalpidVpnService : LifecycleVpnService() {
setMeteredIfSupported(false)
}
- val vpnInterface = builder.establish()
- val tunFd = vpnInterface?.detachFd()
+ val vpnInterfaceFd =
+ try {
+ builder.establish()
+ } catch (e: IllegalStateException) {
+ Logger.e("Failed to establish, a parameter could not be applied", e)
+ return CreateTunResult.TunnelDeviceError
+ } catch (e: IllegalArgumentException) {
+ Logger.e("Failed to establish a parameter was not accepted", e)
+ return CreateTunResult.TunnelDeviceError
+ }
- if (tunFd == null) {
+ if (vpnInterfaceFd == null) {
+ Logger.e("VpnInterface returned null")
return CreateTunResult.TunnelDeviceError
}
+ val tunFd = vpnInterfaceFd.detachFd()
+
waitForTunnelUp(tunFd, config.routes.any { route -> route.isIpv6 })
if (invalidDnsServerAddresses.isNotEmpty()) {
@@ -137,17 +148,19 @@ open class TalpidVpnService : LifecycleVpnService() {
return protect(socket)
}
- private fun prefixForAddress(address: InetAddress): Int {
- return when (address) {
- is Inet4Address -> 32
- is Inet6Address -> 128
+ private fun InetAddress.prefixLength(): Int =
+ when (this) {
+ is Inet4Address -> IPV4_PREFIX_LENGTH
+ is Inet6Address -> IPV6_PREFIX_LENGTH
else -> throw IllegalArgumentException("Invalid IP address (not IPv4 nor IPv6)")
}
- }
private external fun waitForTunnelUp(tunFd: Int, isIpv6Enabled: Boolean)
companion object {
private const val FALLBACK_DUMMY_DNS_SERVER = "192.0.2.1"
+
+ private const val IPV4_PREFIX_LENGTH = 32
+ private const val IPV6_PREFIX_LENGTH = 128
}
}