summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorsaber safavi <saber.safavi@codic.se>2022-11-30 12:59:24 +0100
committersaber safavi <saber.safavi@codic.se>2022-12-13 15:09:47 +0100
commit65ca693d4e5f768633e448d57259de7cbf77e3e9 (patch)
tree36137b3e7fd7964ede98e2a6c9d7bc6c9029f024
parentd57405de3046993032d29c0a6602c5fcfe4d8936 (diff)
downloadmullvadvpn-65ca693d4e5f768633e448d57259de7cbf77e3e9.tar.xz
mullvadvpn-65ca693d4e5f768633e448d57259de7cbf77e3e9.zip
Fix crash on initial messenger events
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/service/endpoint/ServiceEndpoint.kt23
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/util/MessengerExtensions.kt35
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
+ }
+}