diff options
| author | saber safavi <saber.safavi@codic.se> | 2022-11-30 12:59:24 +0100 |
|---|---|---|
| committer | saber safavi <saber.safavi@codic.se> | 2022-12-13 15:09:47 +0100 |
| commit | 65ca693d4e5f768633e448d57259de7cbf77e3e9 (patch) | |
| tree | 36137b3e7fd7964ede98e2a6c9d7bc6c9029f024 /android/app | |
| parent | d57405de3046993032d29c0a6602c5fcfe4d8936 (diff) | |
| download | mullvadvpn-65ca693d4e5f768633e448d57259de7cbf77e3e9.tar.xz mullvadvpn-65ca693d4e5f768633e448d57259de7cbf77e3e9.zip | |
Fix crash on initial messenger events
Diffstat (limited to 'android/app')
| -rw-r--r-- | android/app/src/main/kotlin/net/mullvad/mullvadvpn/service/endpoint/ServiceEndpoint.kt | 23 | ||||
| -rw-r--r-- | android/app/src/main/kotlin/net/mullvad/mullvadvpn/util/MessengerExtensions.kt | 35 |
2 files changed, 51 insertions, 7 deletions
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/service/endpoint/ServiceEndpoint.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/service/endpoint/ServiceEndpoint.kt index 4868f80fd2..4230aa14f1 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/service/endpoint/ServiceEndpoint.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/service/endpoint/ServiceEndpoint.kt @@ -1,7 +1,6 @@ package net.mullvad.mullvadvpn.service.endpoint import android.content.Context -import android.os.DeadObjectException import android.os.Looper import android.os.Messenger import kotlinx.coroutines.Dispatchers @@ -17,8 +16,11 @@ import net.mullvad.mullvadvpn.ipc.Request import net.mullvad.mullvadvpn.service.MullvadDaemon import net.mullvad.mullvadvpn.service.persistence.SplitTunnelingPersistence import net.mullvad.mullvadvpn.util.Intermittent +import net.mullvad.mullvadvpn.util.trySendEvent import net.mullvad.talpid.ConnectivityListener +const val SHOULD_LOG_DEAD_OBJECT_EXCEPTION = true + class ServiceEndpoint( looper: Looper, internal val intermittentDaemon: Intermittent<MullvadDaemon>, @@ -93,13 +95,14 @@ class ServiceEndpoint( val deadListeners = mutableSetOf<Int>() for ((id, listener) in listeners) { - try { - listener.send(event.message) - } catch (_: DeadObjectException) { + if (!listener.trySendEvent( + event, + SHOULD_LOG_DEAD_OBJECT_EXCEPTION + ) + ) { deadListeners.add(id) } } - deadListeners.forEach { listeners.remove(it) } } } @@ -147,8 +150,14 @@ class ServiceEndpoint( initialEvents.add(Event.VpnPermissionRequest) } - initialEvents.forEach { event -> - listener.send(event.message) + val didSuccessfullySendAllMessages = initialEvents.all { event -> + listener.trySendEvent( + event, + SHOULD_LOG_DEAD_OBJECT_EXCEPTION + ) + } + if (didSuccessfullySendAllMessages.not()) { + listeners.remove(listenerId) } } } diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/util/MessengerExtensions.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/util/MessengerExtensions.kt new file mode 100644 index 0000000000..178358ef2e --- /dev/null +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/util/MessengerExtensions.kt @@ -0,0 +1,35 @@ +package net.mullvad.mullvadvpn.util + +import android.os.DeadObjectException +import android.os.Message +import android.os.Messenger +import android.os.RemoteException +import android.util.Log +import net.mullvad.mullvadvpn.ipc.Event + +fun Messenger.trySendEvent(event: Event, logErrors: Boolean): Boolean { + return trySend(event.message, logErrors, event::class.qualifiedName) +} + +private fun Messenger.trySend(message: Message, logErrors: Boolean, messageName: String?): Boolean { + return try { + this.send(message) + true + } catch (deadObjectException: DeadObjectException) { + if (logErrors) { + Log.e( + "mullvad", + "Failed to send message ${messageName ?: "<missing>"} due to DeadObjectException" + ) + } + false + } catch (remoteException: RemoteException) { + if (logErrors) { + Log.e( + "mullvad", + "Failed to send message ${messageName ?: "<missing>"} due to RemoteException" + ) + } + false + } +} |
