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

Commit 60984c6c authored by Kevin Chyn's avatar Kevin Chyn
Browse files

Clear BiometricScheduler when biometric HAL dies

Operations cannot be expected to complete if the HAL dies. The
easiest solution is to clear any existing operation, as well as
any pending operations.

It's dangerous if we leave pending operations in the queue, since
for some HALs, subsequent operations depend on preceeding operations.
For example, updateActiveUser + authenticate.

Fixes: 172683967
Test: atest com.android.server.biometrics

Change-Id: I50b5234d4b382b08767dc359c4a13404e73897c2
parent 92c2f231
Loading
Loading
Loading
Loading
+13 −0
Original line number Diff line number Diff line
@@ -543,6 +543,10 @@ public class BiometricScheduler {
        return mCurrentOperation.clientMonitor;
    }

    public int getCurrentPendingCount() {
        return mPendingOperations.size();
    }

    public void recordCrashState() {
        if (mCrashStates.size() >= CrashState.NUM_ENTRIES) {
            mCrashStates.removeFirst();
@@ -568,4 +572,13 @@ public class BiometricScheduler {
            pw.println("Crash State " + crashState);
        }
    }

    /**
     * Clears the scheduler of anything work-related. This should be used for example when the
     * HAL dies.
     */
    public void reset() {
        mPendingOperations.clear();
        mCurrentOperation = null;
    }
}
+1 −1
Original line number Diff line number Diff line
@@ -219,7 +219,7 @@ public abstract class ClientMonitor<T> extends LoggableMonitor implements IBinde
        return mSensorId;
    }

    public final T getFreshDaemon() {
    public T getFreshDaemon() {
        return mLazyDaemon.getDaemon();
    }

+6 −1
Original line number Diff line number Diff line
@@ -41,6 +41,7 @@ import android.util.Slog;
import android.util.SparseArray;
import android.util.proto.ProtoOutputStream;

import com.android.internal.annotations.VisibleForTesting;
import com.android.server.biometrics.Utils;
import com.android.server.biometrics.sensors.AuthenticationClient;
import com.android.server.biometrics.sensors.ClientMonitor;
@@ -69,7 +70,8 @@ public class FaceProvider implements IBinder.DeathRecipient, ServiceProvider {

    @NonNull private final Context mContext;
    @NonNull private final String mHalInstanceName;
    @NonNull private final SparseArray<Sensor> mSensors; // Map of sensors that this HAL supports
    @NonNull @VisibleForTesting
    final SparseArray<Sensor> mSensors; // Map of sensors that this HAL supports
    @NonNull private final ClientMonitor.LazyDaemon<IFace> mLazyDaemon;
    @NonNull private final Handler mHandler;
    @NonNull private final LockoutResetDispatcher mLockoutResetDispatcher;
@@ -585,8 +587,11 @@ public class FaceProvider implements IBinder.DeathRecipient, ServiceProvider {
        mHandler.post(() -> {
            mDaemon = null;
            for (int i = 0; i < mSensors.size(); i++) {
                final Sensor sensor = mSensors.valueAt(i);
                final int sensorId = mSensors.keyAt(i);
                PerformanceTracker.getInstanceForSensorId(sensorId).incrementHALDeathCount();
                sensor.getScheduler().recordCrashState();
                sensor.getScheduler().reset();
            }
        });
    }
+9 −6
Original line number Diff line number Diff line
@@ -333,16 +333,17 @@ public class Face10 implements IHwBinder.DeathRecipient, ServiceProvider {
    }

    @VisibleForTesting
    public Face10(@NonNull Context context, int sensorId,
    Face10(@NonNull Context context, int sensorId,
            @BiometricManager.Authenticators.Types int strength,
            @NonNull LockoutResetDispatcher lockoutResetDispatcher,
            boolean supportsSelfIllumination, int maxTemplatesAllowed) {
            boolean supportsSelfIllumination, int maxTemplatesAllowed,
            @NonNull BiometricScheduler scheduler) {
        mSensorProperties = new FaceSensorPropertiesInternal(sensorId,
                Utils.authenticatorStrengthToPropertyStrength(strength),
                maxTemplatesAllowed, false /* supportsFaceDetect */, supportsSelfIllumination);
        mContext = context;
        mSensorId = sensorId;
        mScheduler = new BiometricScheduler(TAG, null /* gestureAvailabilityTracker */);
        mScheduler = scheduler;
        mHandler = new Handler(Looper.getMainLooper());
        mUsageStats = new UsageStats(context);
        mAuthenticatorIds = new HashMap<>();
@@ -369,7 +370,8 @@ public class Face10 implements IHwBinder.DeathRecipient, ServiceProvider {
            @NonNull LockoutResetDispatcher lockoutResetDispatcher) {
        this(context, sensorId, strength, lockoutResetDispatcher,
                context.getResources().getBoolean(R.bool.config_faceAuthSupportsSelfIllumination),
                context.getResources().getInteger(R.integer.config_faceMaxTemplatesPerUser));
                context.getResources().getInteger(R.integer.config_faceMaxTemplatesPerUser),
                new BiometricScheduler(TAG, null /* gestureAvailabilityTracker */));
    }

    @Override
@@ -388,12 +390,13 @@ public class Face10 implements IHwBinder.DeathRecipient, ServiceProvider {
                interruptable.onError(BiometricConstants.BIOMETRIC_ERROR_HW_UNAVAILABLE,
                        0 /* vendorCode */);

                mScheduler.recordCrashState();

                FrameworkStatsLog.write(FrameworkStatsLog.BIOMETRIC_SYSTEM_HEALTH_ISSUE_DETECTED,
                        BiometricsProtoEnums.MODALITY_FACE,
                        BiometricsProtoEnums.ISSUE_HAL_DEATH);
            }

            mScheduler.recordCrashState();
            mScheduler.reset();
        });
    }

+6 −1
Original line number Diff line number Diff line
@@ -41,6 +41,7 @@ import android.util.Slog;
import android.util.SparseArray;
import android.util.proto.ProtoOutputStream;

import com.android.internal.annotations.VisibleForTesting;
import com.android.server.biometrics.Utils;
import com.android.server.biometrics.sensors.AuthenticationClient;
import com.android.server.biometrics.sensors.ClientMonitor;
@@ -67,7 +68,8 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi

    @NonNull private final Context mContext;
    @NonNull private final String mHalInstanceName;
    @NonNull private final SparseArray<Sensor> mSensors; // Map of sensors that this HAL supports
    @NonNull @VisibleForTesting
    final SparseArray<Sensor> mSensors; // Map of sensors that this HAL supports
    @NonNull private final ClientMonitor.LazyDaemon<IFingerprint> mLazyDaemon;
    @NonNull private final Handler mHandler;
    @NonNull private final LockoutResetDispatcher mLockoutResetDispatcher;
@@ -607,8 +609,11 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi
            mDaemon = null;

            for (int i = 0; i < mSensors.size(); i++) {
                final Sensor sensor = mSensors.valueAt(i);
                final int sensorId = mSensors.keyAt(i);
                PerformanceTracker.getInstanceForSensorId(sensorId).incrementHALDeathCount();
                sensor.getScheduler().recordCrashState();
                sensor.getScheduler().reset();
            }
        });
    }
Loading