From 96ad5160e59719b870826e93fa7d17898a0e6dfc Mon Sep 17 00:00:00 2001 From: Eric Biggers Date: Tue, 10 Jan 2023 19:38:51 +0000 Subject: [PATCH] LockSettingsStorage: gracefully handle null keys in database Bug: 261860102 Test: com.android.server.locksettings Change-Id: I7606dad85826d82d663a701e9e7bccb9d908da98 --- .../server/locksettings/LockSettingsStorage.java | 8 ++++++-- .../locksettings/LockSettingsStorageTests.java | 14 ++++++++++++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/services/core/java/com/android/server/locksettings/LockSettingsStorage.java b/services/core/java/com/android/server/locksettings/LockSettingsStorage.java index 2c28af1cc6183..434c0d7f955ae 100644 --- a/services/core/java/com/android/server/locksettings/LockSettingsStorage.java +++ b/services/core/java/com/android/server/locksettings/LockSettingsStorage.java @@ -62,6 +62,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Map; +import java.util.Objects; /** * Storage for the lock settings service. @@ -886,12 +887,15 @@ class LockSettingsStorage { if (!(obj instanceof CacheKey)) return false; CacheKey o = (CacheKey) obj; - return userId == o.userId && type == o.type && key.equals(o.key); + return userId == o.userId && type == o.type && Objects.equals(key, o.key); } @Override public int hashCode() { - return key.hashCode() ^ userId ^ type; + int hashCode = Objects.hashCode(key); + hashCode = 31 * hashCode + userId; + hashCode = 31 * hashCode + type; + return hashCode; } } } diff --git a/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsStorageTests.java b/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsStorageTests.java index 03d5b17d7fa85..05208441e3f2c 100644 --- a/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsStorageTests.java +++ b/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsStorageTests.java @@ -265,6 +265,20 @@ public class LockSettingsStorageTests { assertEquals("Cached value didn't match stored value", storage, cached); } + @Test + public void testNullKey() { + mStorage.setString(null, "value", 0); + + // Verify that this doesn't throw an exception. + assertEquals("value", mStorage.readKeyValue(null, null, 0)); + + // The read that happens as part of prefetchUser shouldn't throw an exception either. + mStorage.clearCache(); + mStorage.prefetchUser(0); + + assertEquals("value", mStorage.readKeyValue(null, null, 0)); + } + @Test public void testRemoveUser() { mStorage.writeKeyValue("key", "value", 0);