diff options
4 files changed, 38 insertions, 2 deletions
diff --git a/services/core/java/com/android/server/locksettings/LockSettingsService.java b/services/core/java/com/android/server/locksettings/LockSettingsService.java index 121b7c87223b..31b8ef28f246 100644 --- a/services/core/java/com/android/server/locksettings/LockSettingsService.java +++ b/services/core/java/com/android/server/locksettings/LockSettingsService.java @@ -1156,18 +1156,21 @@ public class LockSettingsService extends ILockSettings.Stub { @Override public void setBoolean(String key, boolean value, int userId) { checkWritePermission(); + Objects.requireNonNull(key); mStorage.setBoolean(key, value, userId); } @Override public void setLong(String key, long value, int userId) { checkWritePermission(); + Objects.requireNonNull(key); mStorage.setLong(key, value, userId); } @Override public void setString(String key, String value, int userId) { checkWritePermission(); + Objects.requireNonNull(key); mStorage.setString(key, value, userId); } diff --git a/services/core/java/com/android/server/locksettings/LockSettingsStorage.java b/services/core/java/com/android/server/locksettings/LockSettingsStorage.java index 2c28af1cc618..434c0d7f955a 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/LockSettingsServiceTests.java b/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsServiceTests.java index 41e3a08be6c5..60a033fde427 100644 --- a/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsServiceTests.java +++ b/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsServiceTests.java @@ -423,6 +423,21 @@ public class LockSettingsServiceTests extends BaseLockSettingsServiceTests { checkPasswordHistoryLength(userId, 3); } + @Test(expected=NullPointerException.class) + public void testSetBooleanRejectsNullKey() { + mService.setBoolean(null, false, 0); + } + + @Test(expected=NullPointerException.class) + public void testSetLongRejectsNullKey() { + mService.setLong(null, 0, 0); + } + + @Test(expected=NullPointerException.class) + public void testSetStringRejectsNullKey() { + mService.setString(null, "value", 0); + } + private void checkPasswordHistoryLength(int userId, int expectedLen) { String history = mService.getString(LockPatternUtils.PASSWORD_HISTORY_KEY, "", userId); String[] hashes = TextUtils.split(history, LockPatternUtils.PASSWORD_HISTORY_DELIMITER); 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 03d5b17d7fa8..05208441e3f2 100644 --- a/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsStorageTests.java +++ b/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsStorageTests.java @@ -266,6 +266,20 @@ public class LockSettingsStorageTests { } @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); mStorage.writeKeyValue("key", "value", 1); |