From cdd03b770a7ff69c172fbd3f507310d2d62c371c Mon Sep 17 00:00:00 2001 From: Eric Biggers Date: Fri, 7 Jul 2023 20:10:07 +0000 Subject: [PATCH 1/2] Ensure that LockSettingsService waits for gatekeeperd to be ready gatekeeperd is started asynchronously. Thus, there is no hard guarantee that it will be ready when LockSettingsService first tries to use it. Therefore, use waitForService() to wait for it to be ready. To avoid introducing any unnecessary delay, stop calling getGateKeeperService() from LockSettingsService#systemReady(), where GK isn't yet needed. This is motivated by a bug that caused gatekeeperd to wait 5 seconds during start-up, fixed by https://r.android.com/2623413. Apparently, that was enough of a delay to sometimes cause gatekeeperd to not be ready by LockSettingsService#loadEscrowData(). Bug: 283055837 Test: Boot and 'atest com.android.server.locksettings' Change-Id: I815151cc6024c447bf3eff194a911ecdaab22d10 --- .../android/server/locksettings/BiometricDeferredQueue.java | 2 +- .../com/android/server/locksettings/LockSettingsService.java | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/services/core/java/com/android/server/locksettings/BiometricDeferredQueue.java b/services/core/java/com/android/server/locksettings/BiometricDeferredQueue.java index 46f486d875b6f..f572845dc214b 100644 --- a/services/core/java/com/android/server/locksettings/BiometricDeferredQueue.java +++ b/services/core/java/com/android/server/locksettings/BiometricDeferredQueue.java @@ -311,7 +311,7 @@ public class BiometricDeferredQueue { @Nullable private static synchronized IGateKeeperService getGatekeeperService() { - final IBinder service = ServiceManager.getService(Context.GATEKEEPER_SERVICE); + final IBinder service = ServiceManager.waitForService(Context.GATEKEEPER_SERVICE); if (service == null) { Slog.e(TAG, "Unable to acquire GateKeeperService"); return null; diff --git a/services/core/java/com/android/server/locksettings/LockSettingsService.java b/services/core/java/com/android/server/locksettings/LockSettingsService.java index 97dc062006694..50ebe99e55ac3 100644 --- a/services/core/java/com/android/server/locksettings/LockSettingsService.java +++ b/services/core/java/com/android/server/locksettings/LockSettingsService.java @@ -843,7 +843,6 @@ public class LockSettingsService extends ILockSettings.Stub { mHasSecureLockScreen = mContext.getPackageManager() .hasSystemFeature(PackageManager.FEATURE_SECURE_LOCK_SCREEN); migrateOldData(); - getGateKeeperService(); getAuthSecretHal(); mDeviceProvisionedObserver.onSystemReady(); @@ -2599,7 +2598,7 @@ public class LockSettingsService extends ILockSettings.Stub { return mGateKeeperService; } - final IBinder service = ServiceManager.getService(Context.GATEKEEPER_SERVICE); + final IBinder service = ServiceManager.waitForService(Context.GATEKEEPER_SERVICE); if (service != null) { try { service.linkToDeath(new GateKeeperDiedRecipient(), 0); From 042cd5d92846f6e0e5f4f0349aeaacdd265df1ee Mon Sep 17 00:00:00 2001 From: Eric Biggers Date: Fri, 7 Jul 2023 20:50:39 +0000 Subject: [PATCH 2/2] Load reboot escrow data at PHASE_BOOT_COMPLETED Users can't be unlocked before PHASE_BOOT_COMPLETED, as is documented and enforced in UserController.java. Therefore, fix LockSettingsService#loadEscrowData() to run at PHASE_BOOT_COMPLETED instead of at PHASE_ACTIVITY_MANAGER_READY. This prevents LockSettingsService from needing to use Gatekeeper earlier than is normally the case, which made it more fragile to delays in Gatekeeper coming up. It might prevent other problems too. Bug: 283055837 Test: atest ResumeOnRebootHostTest Change-Id: I6707b6f33b37f940aecbbd9ec82455fa2a205e99 --- .../com/android/server/locksettings/LockSettingsService.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/locksettings/LockSettingsService.java b/services/core/java/com/android/server/locksettings/LockSettingsService.java index 50ebe99e55ac3..fd4176aac5de0 100644 --- a/services/core/java/com/android/server/locksettings/LockSettingsService.java +++ b/services/core/java/com/android/server/locksettings/LockSettingsService.java @@ -311,8 +311,9 @@ public class LockSettingsService extends ILockSettings.Stub { super.onBootPhase(phase); if (phase == PHASE_ACTIVITY_MANAGER_READY) { mLockSettingsService.migrateOldDataAfterSystemReady(); - mLockSettingsService.loadEscrowData(); mLockSettingsService.deleteRepairModePersistentDataIfNeeded(); + } else if (phase == PHASE_BOOT_COMPLETED) { + mLockSettingsService.loadEscrowData(); } }