summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Kevin Chyn <kchyn@google.com> 2021-02-19 12:42:40 -0800
committer Kevin Chyn <kchyn@google.com> 2021-02-19 13:45:44 -0800
commitbd18a4681dfac0a10ead2cd9b3d5d2992b28b02f (patch)
tree6a4f8425858fc70846573e04fadfc81b011de5c3
parente0552feba5b21af0e692782733442d9392a5e257 (diff)
Fix NPE during fingerprint removal
1) Enroll fingerprint 2) Remove lockscreen credential 3) All fingerprints removed successfully Bug: 180689674 Test: See steps above Change-Id: I8ae947114ec1cc90738152ec33c13cc62c302559
-rw-r--r--core/java/android/hardware/fingerprint/FingerprintManager.java52
1 files changed, 41 insertions, 11 deletions
diff --git a/core/java/android/hardware/fingerprint/FingerprintManager.java b/core/java/android/hardware/fingerprint/FingerprintManager.java
index 6df2764d3f8b..2e4063b6dec1 100644
--- a/core/java/android/hardware/fingerprint/FingerprintManager.java
+++ b/core/java/android/hardware/fingerprint/FingerprintManager.java
@@ -114,6 +114,21 @@ public class FingerprintManager implements BiometricAuthenticator, BiometricFing
*/
public static final int SENSOR_ID_ANY = -1;
+ private static class RemoveTracker {
+ static final int REMOVE_SINGLE = 1;
+ static final int REMOVE_ALL = 2;
+ @IntDef({REMOVE_SINGLE, REMOVE_ALL})
+ @interface RemoveRequest {}
+
+ final @RemoveRequest int mRemoveRequest;
+ @Nullable final Fingerprint mSingleFingerprint;
+
+ RemoveTracker(@RemoveRequest int request, @Nullable Fingerprint fingerprint) {
+ mRemoveRequest = request;
+ mSingleFingerprint = fingerprint;
+ }
+ }
+
private IFingerprintService mService;
private Context mContext;
private IBinder mToken = new Binder();
@@ -123,10 +138,9 @@ public class FingerprintManager implements BiometricAuthenticator, BiometricFing
private RemovalCallback mRemovalCallback;
private GenerateChallengeCallback mGenerateChallengeCallback;
private CryptoObject mCryptoObject;
- private Fingerprint mRemovalFingerprint;
+ @Nullable private RemoveTracker mRemoveTracker;
private Handler mHandler;
-
/**
* Retrieves a list of properties for all fingerprint sensors on the device.
* @hide
@@ -735,7 +749,7 @@ public class FingerprintManager implements BiometricAuthenticator, BiometricFing
public void remove(Fingerprint fp, int userId, RemovalCallback callback) {
if (mService != null) try {
mRemovalCallback = callback;
- mRemovalFingerprint = fp;
+ mRemoveTracker = new RemoveTracker(RemoveTracker.REMOVE_SINGLE, fp);
mService.remove(mToken, fp.getBiometricId(), userId, mServiceReceiver,
mContext.getOpPackageName());
} catch (RemoteException e) {
@@ -752,6 +766,7 @@ public class FingerprintManager implements BiometricAuthenticator, BiometricFing
if (mService != null) {
try {
mRemovalCallback = callback;
+ mRemoveTracker = new RemoveTracker(RemoveTracker.REMOVE_ALL, null /* fp */);
mService.removeAll(mToken, userId, mServiceReceiver, mContext.getOpPackageName());
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
@@ -1055,16 +1070,29 @@ public class FingerprintManager implements BiometricAuthenticator, BiometricFing
if (mRemovalCallback == null) {
return;
}
- if (fingerprint == null) {
- Slog.e(TAG, "Received MSG_REMOVED, but fingerprint is null");
+
+ if (mRemoveTracker == null) {
+ Slog.w(TAG, "Removal tracker is null");
return;
}
- int fingerId = fingerprint.getBiometricId();
- int reqFingerId = mRemovalFingerprint.getBiometricId();
- if (reqFingerId != 0 && fingerId != 0 && fingerId != reqFingerId) {
- Slog.w(TAG, "Finger id didn't match: " + fingerId + " != " + reqFingerId);
- return;
+ if (mRemoveTracker.mRemoveRequest == RemoveTracker.REMOVE_SINGLE) {
+ if (fingerprint == null) {
+ Slog.e(TAG, "Received MSG_REMOVED, but fingerprint is null");
+ return;
+ }
+
+ if (mRemoveTracker.mSingleFingerprint == null) {
+ Slog.e(TAG, "Missing fingerprint");
+ return;
+ }
+
+ final int fingerId = fingerprint.getBiometricId();
+ int reqFingerId = mRemoveTracker.mSingleFingerprint.getBiometricId();
+ if (reqFingerId != 0 && fingerId != 0 && fingerId != reqFingerId) {
+ Slog.w(TAG, "Finger id didn't match: " + fingerId + " != " + reqFingerId);
+ return;
+ }
}
mRemovalCallback.onRemovalSucceeded(fingerprint, remaining);
@@ -1121,7 +1149,9 @@ public class FingerprintManager implements BiometricAuthenticator, BiometricFing
mAuthenticationCallback.onAuthenticationError(clientErrMsgId,
getErrorString(mContext, errMsgId, vendorCode));
} else if (mRemovalCallback != null) {
- mRemovalCallback.onRemovalError(mRemovalFingerprint, clientErrMsgId,
+ final Fingerprint fp = mRemoveTracker != null
+ ? mRemoveTracker.mSingleFingerprint : null;
+ mRemovalCallback.onRemovalError(fp, clientErrMsgId,
getErrorString(mContext, errMsgId, vendorCode));
}
}