diff options
author | 2025-01-22 11:37:52 -0800 | |
---|---|---|
committer | 2025-01-22 11:37:52 -0800 | |
commit | 4efa8d1b8b0fed3ab0197a3f37befb21b03bc6da (patch) | |
tree | b953ffc1477d4e057a5f8dd53264b57a2b357640 | |
parent | 9882626fd957caf83d801a300c69247dd850bae0 (diff) | |
parent | 42ea8101e3952434b117e3137c59f665d8f62fb4 (diff) |
Merge "Store LockscreenCredential in non-movable byte array" into main
-rw-r--r-- | core/java/com/android/internal/widget/LockPatternUtils.java | 2 | ||||
-rw-r--r-- | core/java/com/android/internal/widget/LockscreenCredential.java | 21 |
2 files changed, 16 insertions, 7 deletions
diff --git a/core/java/com/android/internal/widget/LockPatternUtils.java b/core/java/com/android/internal/widget/LockPatternUtils.java index d12976230175..83750aca3766 100644 --- a/core/java/com/android/internal/widget/LockPatternUtils.java +++ b/core/java/com/android/internal/widget/LockPatternUtils.java @@ -1051,7 +1051,7 @@ public class LockPatternUtils { } final int patternSize = pattern.size(); - byte[] res = new byte[patternSize]; + byte[] res = newNonMovableByteArray(patternSize); for (int i = 0; i < patternSize; i++) { LockPatternView.Cell cell = pattern.get(i); res[i] = (byte) (cell.getRow() * 3 + cell.getColumn() + '1'); diff --git a/core/java/com/android/internal/widget/LockscreenCredential.java b/core/java/com/android/internal/widget/LockscreenCredential.java index 92ce990c67df..2a12c986ab04 100644 --- a/core/java/com/android/internal/widget/LockscreenCredential.java +++ b/core/java/com/android/internal/widget/LockscreenCredential.java @@ -81,9 +81,9 @@ public class LockscreenCredential implements Parcelable, AutoCloseable { /** * Private constructor, use static builder methods instead. * - * <p> Builder methods should create a private copy of the credential bytes and pass in here. - * LockscreenCredential will only store the reference internally without copying. This is to - * minimize the number of extra copies introduced. + * <p> Builder methods should create a private copy of the credential bytes using a non-movable + * array and pass it in here. LockscreenCredential will only store the reference internally + * without copying. This is to minimize the number of extra copies introduced. */ private LockscreenCredential(int type, byte[] credential, boolean hasInvalidChars) { Objects.requireNonNull(credential); @@ -141,7 +141,7 @@ public class LockscreenCredential implements Parcelable, AutoCloseable { */ public static LockscreenCredential createUnifiedProfilePassword(@NonNull byte[] password) { return new LockscreenCredential(CREDENTIAL_TYPE_PASSWORD, - Arrays.copyOf(password, password.length), /* hasInvalidChars= */ false); + copyOfArrayNonMovable(password), /* hasInvalidChars= */ false); } /** @@ -237,7 +237,7 @@ public class LockscreenCredential implements Parcelable, AutoCloseable { /** Create a copy of the credential */ public LockscreenCredential duplicate() { return new LockscreenCredential(mType, - mCredential != null ? Arrays.copyOf(mCredential, mCredential.length) : null, + mCredential != null ? copyOfArrayNonMovable(mCredential) : null, mHasInvalidChars); } @@ -252,6 +252,15 @@ public class LockscreenCredential implements Parcelable, AutoCloseable { } /** + * Copies the given array into a new non-movable array. + */ + private static byte[] copyOfArrayNonMovable(byte[] array) { + byte[] copy = LockPatternUtils.newNonMovableByteArray(array.length); + System.arraycopy(array, 0, copy, 0, array.length); + return copy; + } + + /** * Checks whether the credential meets basic requirements for setting it as a new credential. * * This is redundant if {@link android.app.admin.PasswordMetrics#validateCredential()}, which @@ -440,7 +449,7 @@ public class LockscreenCredential implements Parcelable, AutoCloseable { * @return A byte array representing the input */ private static byte[] charsToBytesTruncating(CharSequence chars) { - byte[] bytes = new byte[chars.length()]; + byte[] bytes = LockPatternUtils.newNonMovableByteArray(chars.length()); for (int i = 0; i < chars.length(); i++) { bytes[i] = (byte) chars.charAt(i); } |