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

Commit 7be37b38 authored by lijilou's avatar lijilou Committed by Jilou li
Browse files

fix the CWE problem in Biometrics.

Multiple threads concurrently execute add operation and traversal operation, resulting in concurrent modification exception. We can replace the thread-unsafe ArrayList with the thread-safe CopyOnWriteArrayList.

Test: OEM monkey test
Flag: EXEMPT bugfix
Bug: 378809027
Change-Id: Id956bebe94cfd773b852292815bcee7f5d60bb77
parent 8ce40991
Loading
Loading
Loading
Loading
+6 −5
Original line number Diff line number Diff line
@@ -95,6 +95,7 @@ import java.util.Map;
import java.util.Random;
import java.util.Set;
import java.util.concurrent.atomic.AtomicLong;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.function.Supplier;

/**
@@ -126,7 +127,7 @@ public class BiometricService extends SystemService {
    IGateKeeperService mGateKeeper;

    // Get and cache the available biometric authenticators and their associated info.
    final ArrayList<BiometricSensor> mSensors = new ArrayList<>();
    final CopyOnWriteArrayList<BiometricSensor> mSensors = new CopyOnWriteArrayList<>();

    @VisibleForTesting
    BiometricStrengthController mBiometricStrengthController;
@@ -150,13 +151,13 @@ public class BiometricService extends SystemService {
        @NonNull private final Set<Integer> mSensorsPendingInvalidation;

        public static InvalidationTracker start(@NonNull Context context,
                @NonNull ArrayList<BiometricSensor> sensors,
                int userId, int fromSensorId, @NonNull IInvalidationCallback clientCallback) {
                @NonNull List<BiometricSensor> sensors, int userId,
                int fromSensorId, @NonNull IInvalidationCallback clientCallback) {
            return new InvalidationTracker(context, sensors, userId, fromSensorId, clientCallback);
        }

        private InvalidationTracker(@NonNull Context context,
                @NonNull ArrayList<BiometricSensor> sensors, int userId,
                @NonNull List<BiometricSensor> sensors, int userId,
                int fromSensorId, @NonNull IInvalidationCallback clientCallback) {
            mClientCallback = clientCallback;
            mSensorsPendingInvalidation = new ArraySet<>();
@@ -692,7 +693,7 @@ public class BiometricService extends SystemService {

        @android.annotation.EnforcePermission(android.Manifest.permission.USE_BIOMETRIC_INTERNAL)
        @Override
        public synchronized void registerAuthenticator(int id, int modality,
        public void registerAuthenticator(int id, int modality,
                @Authenticators.Types int strength,
                @NonNull IBiometricAuthenticator authenticator) {