From 5f8125f572349bfbfd54d88b8dce2f7660ce27c3 Mon Sep 17 00:00:00 2001 From: Eric Biggers Date: Thu, 29 Jun 2023 18:17:02 +0000 Subject: Reconnect if weaver service connection dies For robustness reasons, reconnect to the Weaver service if it dies. This should not be relied on, but it's easy to do and is the same thing that LockSettingsService does for the Gatekeeper service. Bug: 287705522 Test: Treehugger Change-Id: Ic06c45353c6b7282e2f22eef13ea1c6e36fe5c58 Merged-In: Ic06c45353c6b7282e2f22eef13ea1c6e36fe5c58 (cherry picked from commit 5b21e30b66567881f40bd531d5d1750b1b987cc7) --- .../locksettings/SyntheticPasswordManager.java | 23 +++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/locksettings/SyntheticPasswordManager.java b/services/core/java/com/android/server/locksettings/SyntheticPasswordManager.java index 131e365e2362..c294417704b2 100644 --- a/services/core/java/com/android/server/locksettings/SyntheticPasswordManager.java +++ b/services/core/java/com/android/server/locksettings/SyntheticPasswordManager.java @@ -31,6 +31,7 @@ import android.hardware.weaver.IWeaver; import android.hardware.weaver.WeaverConfig; import android.hardware.weaver.WeaverReadResponse; import android.hardware.weaver.WeaverReadStatus; +import android.os.IBinder; import android.os.RemoteCallbackList; import android.os.RemoteException; import android.os.ServiceManager; @@ -500,7 +501,7 @@ class SyntheticPasswordManager { private final Context mContext; private LockSettingsStorage mStorage; - private IWeaver mWeaver; + private volatile IWeaver mWeaver; private WeaverConfig mWeaverConfig; private PasswordSlotManager mPasswordSlotManager; @@ -531,6 +532,21 @@ class SyntheticPasswordManager { } } + private class WeaverDiedRecipient implements IBinder.DeathRecipient { + // Not synchronized on the outer class, since setting the pointer to null is atomic, and we + // don't want to have to worry about any sort of deadlock here. + @Override + public void binderDied() { + // Weaver died. Try to recover by setting mWeaver to null, which makes + // getWeaverService() look up the service again. This is done only as a simple + // robustness measure; it should not be relied on. If this triggers, the root cause is + // almost certainly a bug in the device's Weaver implementation, which must be fixed. + Slog.wtf(TAG, "Weaver service has died"); + mWeaver.asBinder().unlinkToDeath(this, 0); + mWeaver = null; + } + } + private @Nullable IWeaver getWeaverServiceInternal() { // Try to get the AIDL service first try { @@ -538,6 +554,11 @@ class SyntheticPasswordManager { ServiceManager.waitForDeclaredService(IWeaver.DESCRIPTOR + "/default")); if (aidlWeaver != null) { Slog.i(TAG, "Using AIDL weaver service"); + try { + aidlWeaver.asBinder().linkToDeath(new WeaverDiedRecipient(), 0); + } catch (RemoteException e) { + Slog.w(TAG, "Unable to register Weaver death recipient", e); + } return aidlWeaver; } } catch (SecurityException e) { -- cgit v1.2.3-59-g8ed1b