diff options
| author | David Göransson <david.goransson@mullvad.net> | 2024-09-06 16:02:17 +0200 |
|---|---|---|
| committer | David Göransson <david.goransson@mullvad.net> | 2024-09-06 16:02:17 +0200 |
| commit | b10d43a7546215b7e6d4f2a07f57398d818c68e0 (patch) | |
| tree | 132784af66b606a0e65a66482c5de7d8e851c7cb /android/lib | |
| parent | 17788c6ab46aef57eddc87f7eefd5a1f65a4683c (diff) | |
| parent | 4c711955d02ef6847dd3c8a5906657698c8a9ce9 (diff) | |
| download | mullvadvpn-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.kt | 31 |
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 } } |
