From ed1c9cae12de4718669528b557b3a8c2c7b951c2 Mon Sep 17 00:00:00 2001 From: zhangyupeng1 Date: Thu, 23 Jul 2020 21:56:37 +0800 Subject: [BugFix][Fingerprint]fix client was canceled by service by mistake issue: After the call of client A started in the lockout state returns, after client B calls the fp service, A is dead, a death notification will be sent to the service, and the service will stop clent B. solution: Each time onAuthentication sets a flag mAlreadyDone to true. Judge this flag as true in binderDie, and keep the current fingerprint operation to avoid affecting the current user Signed-off-by: zhangyupeng1 Change-Id: I56ce99505febbb48dc13ccfc3c2d120123da4fa3 Merged-In: I56ce99505febbb48dc13ccfc3c2d120123da4fa3 --- .../core/java/com/android/server/biometrics/AuthenticationClient.java | 3 +++ .../core/java/com/android/server/biometrics/BiometricServiceBase.java | 1 + services/core/java/com/android/server/biometrics/ClientMonitor.java | 4 ++++ 3 files changed, 8 insertions(+) diff --git a/services/core/java/com/android/server/biometrics/AuthenticationClient.java b/services/core/java/com/android/server/biometrics/AuthenticationClient.java index 4a9ccdee0522..13a2c19c1d99 100644 --- a/services/core/java/com/android/server/biometrics/AuthenticationClient.java +++ b/services/core/java/com/android/server/biometrics/AuthenticationClient.java @@ -217,6 +217,9 @@ public abstract class AuthenticationClient extends ClientMonitor { } } result = lockoutMode != LOCKOUT_NONE; // in a lockout mode + if(result) { // lockde out + mAlreadyDone = true; + } } } catch (RemoteException e) { Slog.e(getLogTag(), "Remote exception", e); diff --git a/services/core/java/com/android/server/biometrics/BiometricServiceBase.java b/services/core/java/com/android/server/biometrics/BiometricServiceBase.java index f3f9754bd32b..a4768f42cca2 100644 --- a/services/core/java/com/android/server/biometrics/BiometricServiceBase.java +++ b/services/core/java/com/android/server/biometrics/BiometricServiceBase.java @@ -945,6 +945,7 @@ public abstract class BiometricServiceBase extends SystemService if (!client.onError(getHalDeviceId(), errorCode, 0 /* vendorCode */)) { Slog.w(getTag(), "Cannot send permanent lockout message to client"); } + return; } startClient(client, true /* initiatedByClient */); diff --git a/services/core/java/com/android/server/biometrics/ClientMonitor.java b/services/core/java/com/android/server/biometrics/ClientMonitor.java index 942e0501d88d..8234a520e5db 100644 --- a/services/core/java/com/android/server/biometrics/ClientMonitor.java +++ b/services/core/java/com/android/server/biometrics/ClientMonitor.java @@ -233,6 +233,10 @@ public abstract class ClientMonitor extends LoggableMonitor implements IBinder.D @Override public void binderDied() { + if (isAlreadyDone()) { + Slog.w(getLogTag(), "Binder died but client is finished, ignoring"); + return; + } // If the current client dies we should cancel the current operation. Slog.e(getLogTag(), "Binder died, cancelling client"); stop(false /* initiatedByClient */); -- cgit v1.2.3-59-g8ed1b