diff options
| author | 2025-01-08 17:29:53 -0800 | |
|---|---|---|
| committer | 2025-01-08 17:29:53 -0800 | |
| commit | cf35643bcaae87539e7e894620392afe3d6791d6 (patch) | |
| tree | 8e41fd673ae07b18b5fae98a0701f4b4f9f7d05d | |
| parent | 3092310e42a94603b429126bb3fd37497b2f62a8 (diff) | |
| parent | 923ad094c29f3641474213ae316bb6009f984f88 (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.java | 9 | ||||
| -rw-r--r-- | core/java/android/os/Parcel.java | 12 |
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; } /** |