From 9b1e1c4c08904110ab78fde50b97e0d61243c46f Mon Sep 17 00:00:00 2001 From: Max Bires Date: Fri, 13 Aug 2021 08:59:29 -0700 Subject: [PATCH] Fixing a condition that can cause deadlock Callbacks on ServiceConnection happen on the main UI thread for an application. Since the thread that calls bindService then immediately blocks to wait for the service to be connected, this will cause a deadlock if key operations are happening on the main UI thread. This bug has likely not been detected yet since key operations are not supposed to be performed on the main UI thread, however it was uncovered in a similar application during other testing. This fix ensures the ServiceConnection object's callbacks will be triggered from a separate thread from the calling thread. Bug: 196571032 Test: Apps that run key operations on the UI thread don't hang. Change-Id: I630a0ef2560a8ebd962de54c65e3d6277133a1cb --- keystore/java/android/security/GenerateRkpKey.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/keystore/java/android/security/GenerateRkpKey.java b/keystore/java/android/security/GenerateRkpKey.java index 053bec74405e9..2e54e63a5b7aa 100644 --- a/keystore/java/android/security/GenerateRkpKey.java +++ b/keystore/java/android/security/GenerateRkpKey.java @@ -25,6 +25,8 @@ import android.os.RemoteException; import android.util.Log; import java.util.concurrent.CountDownLatch; +import java.util.concurrent.Executor; +import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; /** @@ -88,7 +90,8 @@ public class GenerateRkpKey { } intent.setComponent(comp); mCountDownLatch = new CountDownLatch(1); - if (!mContext.bindService(intent, mConnection, Context.BIND_AUTO_CREATE)) { + Executor executor = Executors.newCachedThreadPool(); + if (!mContext.bindService(intent, Context.BIND_AUTO_CREATE, executor, mConnection)) { throw new RemoteException("Failed to bind to GenerateRkpKeyService"); } try {