summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Eric Biggers <ebiggers@google.com> 2025-01-22 11:37:52 -0800
committer Gerrit Code Review <noreply-gerritcodereview@google.com> 2025-01-22 11:37:52 -0800
commit4efa8d1b8b0fed3ab0197a3f37befb21b03bc6da (patch)
treeb953ffc1477d4e057a5f8dd53264b57a2b357640
parent9882626fd957caf83d801a300c69247dd850bae0 (diff)
parent42ea8101e3952434b117e3137c59f665d8f62fb4 (diff)
Merge "Store LockscreenCredential in non-movable byte array" into main
-rw-r--r--core/java/com/android/internal/widget/LockPatternUtils.java2
-rw-r--r--core/java/com/android/internal/widget/LockscreenCredential.java21
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);
}