summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Treehugger Robot <android-test-infra-autosubmit@system.gserviceaccount.com> 2025-01-08 17:29:53 -0800
committer Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> 2025-01-08 17:29:53 -0800
commitcf35643bcaae87539e7e894620392afe3d6791d6 (patch)
tree8e41fd673ae07b18b5fae98a0701f4b4f9f7d05d
parent3092310e42a94603b429126bb3fd37497b2f62a8 (diff)
parent923ad094c29f3641474213ae316bb6009f984f88 (diff)
Merge "BaseBundle: fix unparcel error logic" into tm-dev am: 923ad094c2
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/30961238 Change-Id: I32ca9aa76621b1ab232ab072faf4de062e0c36aa Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
-rw-r--r--core/java/android/os/BaseBundle.java9
-rw-r--r--core/java/android/os/Parcel.java12
2 files changed, 12 insertions, 9 deletions
diff --git a/core/java/android/os/BaseBundle.java b/core/java/android/os/BaseBundle.java
index b599028ccb9b..23966080e57e 100644
--- a/core/java/android/os/BaseBundle.java
+++ b/core/java/android/os/BaseBundle.java
@@ -437,12 +437,15 @@ public class BaseBundle {
map.erase();
map.ensureCapacity(count);
}
+
+ int[] numLazyValues = new int[]{0};
+
try {
// recycleParcel being false implies that we do not own the parcel. In this case, do
// not use lazy values to be safe, as the parcel could be recycled outside of our
// control.
- recycleParcel &= parcelledData.readArrayMap(map, count, !parcelledByNative,
- /* lazy */ recycleParcel, mClassLoader);
+ parcelledData.readArrayMap(map, count, !parcelledByNative,
+ /* lazy */ recycleParcel, mClassLoader, numLazyValues);
} catch (BadParcelableException e) {
if (sShouldDefuse) {
Log.w(TAG, "Failed to parse Bundle, but defusing quietly", e);
@@ -451,6 +454,8 @@ public class BaseBundle {
throw e;
}
} finally {
+ recycleParcel &= (numLazyValues[0] == 0);
+
mMap = map;
if (recycleParcel) {
recycleParcel(parcelledData);
diff --git a/core/java/android/os/Parcel.java b/core/java/android/os/Parcel.java
index 4bdef89154c2..f68e3c9e87d9 100644
--- a/core/java/android/os/Parcel.java
+++ b/core/java/android/os/Parcel.java
@@ -5265,7 +5265,7 @@ public final class Parcel {
private void readArrayMapInternal(@NonNull ArrayMap<? super String, Object> outVal,
int size, @Nullable ClassLoader loader) {
- readArrayMap(outVal, size, /* sorted */ true, /* lazy */ false, loader);
+ readArrayMap(outVal, size, /* sorted */ true, /* lazy */ false, loader, null);
}
/**
@@ -5275,17 +5275,16 @@ public final class Parcel {
* @param lazy Whether to populate the map with lazy {@link Supplier} objects for
* length-prefixed values. See {@link Parcel#readLazyValue(ClassLoader)} for more
* details.
- * @return whether the parcel can be recycled or not.
+ * @param lazyValueCount number of lazy values added here
* @hide
*/
- boolean readArrayMap(ArrayMap<? super String, Object> map, int size, boolean sorted,
- boolean lazy, @Nullable ClassLoader loader) {
- boolean recycle = true;
+ void readArrayMap(ArrayMap<? super String, Object> map, int size, boolean sorted,
+ boolean lazy, @Nullable ClassLoader loader, int[] lazyValueCount) {
while (size > 0) {
String key = readString();
Object value = (lazy) ? readLazyValue(loader) : readValue(loader);
if (value instanceof LazyValue) {
- recycle = false;
+ lazyValueCount[0]++;
}
if (sorted) {
map.append(key, value);
@@ -5297,7 +5296,6 @@ public final class Parcel {
if (sorted) {
map.validate();
}
- return recycle;
}
/**