diff options
| author | 2024-11-13 15:58:14 +0800 | |
|---|---|---|
| committer | 2024-11-14 01:42:32 +0000 | |
| commit | 7be37b38cd0641e980e954129bb5de016c7fe32c (patch) | |
| tree | dfd3bbf25305643906200aa49474c80da0e67f48 | |
| parent | 8ce40991fb51666921180b854508be100cc3eb00 (diff) | |
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
| -rw-r--r-- | services/core/java/com/android/server/biometrics/BiometricService.java | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/services/core/java/com/android/server/biometrics/BiometricService.java b/services/core/java/com/android/server/biometrics/BiometricService.java index 0e81eb914697..c31a4fb3569d 100644 --- a/services/core/java/com/android/server/biometrics/BiometricService.java +++ b/services/core/java/com/android/server/biometrics/BiometricService.java @@ -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) { |