From 13c7b270e22ff628a3555d59fce21b1595ff4615 Mon Sep 17 00:00:00 2001 From: Curtis Belmonte Date: Mon, 15 Mar 2021 14:04:08 -0700 Subject: [PATCH] Fix possible NPE in fingerprint service provider Test: atest FingerprintManagerTest Bug: 179073068 Change-Id: If624d54834c443b727e574333a4bd116f11a297c --- .../sensors/fingerprint/ServiceProvider.java | 8 +++++++- .../fingerprint/aidl/FingerprintProvider.java | 13 +++++++++++-- .../sensors/fingerprint/hidl/Fingerprint21.java | 2 +- 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/ServiceProvider.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/ServiceProvider.java index dfec2e3e308f7..0d50499bd02a1 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/ServiceProvider.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/ServiceProvider.java @@ -67,7 +67,13 @@ public interface ServiceProvider { @NonNull List getSensorProperties(); - @NonNull + /** + * Returns the internal properties of the specified sensor, if owned by this provider. + * + * @param sensorId The ID of a fingerprint sensor, or -1 for any sensor. + * @return An object representing the internal properties of the specified sensor. + */ + @Nullable FingerprintSensorPropertiesInternal getSensorProperties(int sensorId); void scheduleResetLockout(int sensorId, int userId, @Nullable byte[] hardwareAuthToken); diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProvider.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProvider.java index 598cc8992c2db..d798198782eae 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProvider.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProvider.java @@ -16,6 +16,8 @@ package com.android.server.biometrics.sensors.fingerprint.aidl; +import static android.hardware.fingerprint.FingerprintManager.SENSOR_ID_ANY; + import android.annotation.NonNull; import android.annotation.Nullable; import android.app.ActivityManager; @@ -240,10 +242,17 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi return props; } - @NonNull + @Nullable @Override public FingerprintSensorPropertiesInternal getSensorProperties(int sensorId) { - return mSensors.get(sensorId).getSensorProperties(); + if (mSensors.size() == 0) { + return null; + } else if (sensorId == SENSOR_ID_ANY) { + return mSensors.valueAt(0).getSensorProperties(); + } else { + final Sensor sensor = mSensors.get(sensorId); + return sensor != null ? sensor.getSensorProperties() : null; + } } private void scheduleLoadAuthenticatorIds(int sensorId) { diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21.java index 6e22a797b435b..fd3db6072357e 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21.java @@ -515,7 +515,7 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider return properties; } - @NonNull + @Nullable @Override public FingerprintSensorPropertiesInternal getSensorProperties(int sensorId) { return mSensorProperties;