From 9c04af0d613862730a7621f494c9f3fce1642006 Mon Sep 17 00:00:00 2001 From: Mygod Date: Thu, 20 May 2021 17:10:40 -0400 Subject: [PATCH] Fix counter not protected by mutex --- .../java/be/mygod/librootkotlinx/RootServer.kt | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/mobile/src/main/java/be/mygod/librootkotlinx/RootServer.kt b/mobile/src/main/java/be/mygod/librootkotlinx/RootServer.kt index 86f98dc4..fcb3dac4 100644 --- a/mobile/src/main/java/be/mygod/librootkotlinx/RootServer.kt +++ b/mobile/src/main/java/be/mygod/librootkotlinx/RootServer.kt @@ -245,13 +245,14 @@ class RootServer { @Throws(RemoteException::class) suspend fun execute(command: RootCommand, classLoader: ClassLoader?): T { val future = CompletableDeferred() - @Suppress("UNCHECKED_CAST") - val callback = Callback.Ordinary(this, counter, classLoader, future as CompletableDeferred) - mutex.withLock { + val callback = mutex.withLock { + @Suppress("UNCHECKED_CAST") + val callback = Callback.Ordinary(this, counter, classLoader, future as CompletableDeferred) if (active) { callbackLookup[counter] = callback sendLocked(command) } else future.cancel() + callback } try { return future.await() @@ -275,13 +276,14 @@ class RootServer { else -> throw IllegalArgumentException("Unsupported channel capacity $it") } }) { - @Suppress("UNCHECKED_CAST") - val callback = Callback.Channel(this@RootServer, counter, classLoader, this as SendChannel) - mutex.withLock { + val callback = mutex.withLock { + @Suppress("UNCHECKED_CAST") + val callback = Callback.Channel(this@RootServer, counter, classLoader, this as SendChannel) if (active) { callbackLookup[counter] = callback sendLocked(command) } else callback.finish.cancel() + callback } try { callback.finish.await()