Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit bd18a468 authored by Kevin Chyn's avatar Kevin Chyn
Browse files

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
parent e0552feb
Loading
Loading
Loading
Loading
+41 −11
Original line number Diff line number Diff line
@@ -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,17 +1070,30 @@ public class FingerprintManager implements BiometricAuthenticator, BiometricFing
        if (mRemovalCallback == null) {
            return;
        }

        if (mRemoveTracker == null) {
            Slog.w(TAG, "Removal tracker is null");
            return;
        }

        if (mRemoveTracker.mRemoveRequest == RemoveTracker.REMOVE_SINGLE) {
            if (fingerprint == null) {
                Slog.e(TAG, "Received MSG_REMOVED, but fingerprint is null");
                return;
            }

        int fingerId = fingerprint.getBiometricId();
        int reqFingerId = mRemovalFingerprint.getBiometricId();
            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));
        }
    }