summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/biometrics/face/FaceService.java28
1 files changed, 26 insertions, 2 deletions
diff --git a/services/core/java/com/android/server/biometrics/face/FaceService.java b/services/core/java/com/android/server/biometrics/face/FaceService.java
index 72bac7494804..a38abdc1bed0 100644
--- a/services/core/java/com/android/server/biometrics/face/FaceService.java
+++ b/services/core/java/com/android/server/biometrics/face/FaceService.java
@@ -63,6 +63,7 @@ import com.android.server.SystemServerInitThreadPool;
import com.android.server.biometrics.AuthenticationClient;
import com.android.server.biometrics.BiometricServiceBase;
import com.android.server.biometrics.BiometricUtils;
+import com.android.server.biometrics.ClientMonitor;
import com.android.server.biometrics.Constants;
import com.android.server.biometrics.EnumerateClient;
import com.android.server.biometrics.RemovalClient;
@@ -342,7 +343,16 @@ public class FaceService extends BiometricServiceBase {
@Override // Binder call
public int revokeChallenge(IBinder token) {
checkPermission(MANAGE_BIOMETRIC);
- return startRevokeChallenge(token);
+ // TODO(b/137106905): Schedule binder calls in FaceService to avoid deadlocks.
+ if (getCurrentClient() == null) {
+ // if we aren't handling any other HIDL calls (mCurrentClient == null), revoke the
+ // challenge right away.
+ return startRevokeChallenge(token);
+ } else {
+ // postpone revoking the challenge until we finish processing the current HIDL call.
+ mRevokeChallengePending = true;
+ return Status.OK;
+ }
}
@Override // Binder call
@@ -812,6 +822,7 @@ public class FaceService extends BiometricServiceBase {
@GuardedBy("this")
private IBiometricsFace mDaemon;
private UsageStats mUsageStats;
+ private boolean mRevokeChallengePending = false;
// One of the AuthenticationClient constants
private int mCurrentUserLockoutMode;
@@ -1041,6 +1052,15 @@ public class FaceService extends BiometricServiceBase {
}
@Override
+ protected void removeClient(ClientMonitor client) {
+ super.removeClient(client);
+ if (mRevokeChallengePending) {
+ startRevokeChallenge(null);
+ mRevokeChallengePending = false;
+ }
+ }
+
+ @Override
public void onStart() {
super.onStart();
publishBinderService(Context.FACE_SERVICE, new FaceServiceWrapper());
@@ -1251,7 +1271,11 @@ public class FaceService extends BiometricServiceBase {
return 0;
}
try {
- return daemon.revokeChallenge();
+ final int res = daemon.revokeChallenge();
+ if (res != Status.OK) {
+ Slog.e(TAG, "revokeChallenge returned " + res);
+ }
+ return res;
} catch (RemoteException e) {
Slog.e(TAG, "startRevokeChallenge failed", e);
}