diff options
| author | 2023-10-11 19:32:04 +0000 | |
|---|---|---|
| committer | 2023-10-11 19:32:04 +0000 | |
| commit | 1a97a06c3411950905dd9ab5fe7fd8a9d593b098 (patch) | |
| tree | 8e822569c272386affad44e2f44f310a4b798496 | |
| parent | 2032bc0bb34e5b81f72cb76bd35ce19794ed6440 (diff) | |
| parent | 5f8125f572349bfbfd54d88b8dce2f7660ce27c3 (diff) | |
Reconnect if weaver service connection dies am: 5f8125f572
Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/2781896
Change-Id: I648bd8d0d1ad0f73eab1f32f3c0826e6ba0a8005
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
| -rw-r--r-- | services/core/java/com/android/server/locksettings/SyntheticPasswordManager.java | 23 |
1 files changed, 22 insertions, 1 deletions
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) { |