From b36acbf6a71b01add2ed7b9e7f495125620f1256 Mon Sep 17 00:00:00 2001 From: Jeff Sharkey Date: Tue, 31 Mar 2020 21:10:20 -0600 Subject: Deep copy arguments to avoid accidental mutation. Otherwise we'd risk applying different arguments to active versus future connections. Bug: 152005629 Test: atest CtsDatabaseTestCases:android.database.sqlite.cts.SQLiteDatabaseTest Change-Id: I6e83a47d9874825fd14940245412372ef9227e79 --- core/java/android/database/DatabaseUtils.java | 29 +++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) (limited to 'core/java/android/database/DatabaseUtils.java') diff --git a/core/java/android/database/DatabaseUtils.java b/core/java/android/database/DatabaseUtils.java index 34cc856e000f..9b809b86eae9 100644 --- a/core/java/android/database/DatabaseUtils.java +++ b/core/java/android/database/DatabaseUtils.java @@ -43,6 +43,7 @@ import com.android.internal.util.ArrayUtils; import java.io.FileNotFoundException; import java.io.PrintStream; import java.text.Collator; +import java.util.Arrays; import java.util.HashMap; import java.util.Locale; import java.util.Map; @@ -307,6 +308,34 @@ public class DatabaseUtils { return res.toString(); } + /** + * Make a deep copy of the given argument list, ensuring that the returned + * value is completely isolated from any changes to the original arguments. + * + * @hide + */ + public static @Nullable Object[] deepCopyOf(@Nullable Object[] args) { + if (args == null) return null; + + final Object[] res = new Object[args.length]; + for (int i = 0; i < args.length; i++) { + final Object arg = args[i]; + + if ((arg == null) || (arg instanceof Number) || (arg instanceof String)) { + // When the argument is immutable, we can copy by reference + res[i] = arg; + } else if (arg instanceof byte[]) { + // Need to deep copy blobs + final byte[] castArg = (byte[]) arg; + res[i] = Arrays.copyOf(castArg, castArg.length); + } else { + // Convert everything else to string, making it immutable + res[i] = String.valueOf(arg); + } + } + return res; + } + /** * Returns data type of the given object's value. *

-- cgit v1.2.3