summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/os/Parcel.java19
1 files changed, 19 insertions, 0 deletions
diff --git a/core/java/android/os/Parcel.java b/core/java/android/os/Parcel.java
index 5ba6553a58c9..0879118ff856 100644
--- a/core/java/android/os/Parcel.java
+++ b/core/java/android/os/Parcel.java
@@ -3668,6 +3668,7 @@ public final class Parcel {
int length = readInt();
if (length >= 0)
{
+ ensureWithinMemoryLimit(SIZE_COMPLEX_TYPE, length);
array = new CharSequence[length];
for (int i = 0 ; i < length ; i++)
@@ -3689,6 +3690,7 @@ public final class Parcel {
int length = readInt();
if (length >= 0) {
+ ensureWithinMemoryLimit(SIZE_COMPLEX_TYPE, length);
array = new ArrayList<CharSequence>(length);
for (int i = 0 ; i < length ; i++) {
@@ -3831,6 +3833,7 @@ public final class Parcel {
if (N < 0) {
return null;
}
+ ensureWithinMemoryLimit(SIZE_COMPLEX_TYPE, N);
SparseBooleanArray sa = new SparseBooleanArray(N);
readSparseBooleanArrayInternal(sa, N);
return sa;
@@ -3847,6 +3850,7 @@ public final class Parcel {
if (N < 0) {
return null;
}
+ ensureWithinMemoryLimit(SIZE_COMPLEX_TYPE, N);
SparseIntArray sa = new SparseIntArray(N);
readSparseIntArrayInternal(sa, N);
return sa;
@@ -3892,6 +3896,7 @@ public final class Parcel {
public final <T> void readTypedList(@NonNull List<T> list, @NonNull Parcelable.Creator<T> c) {
int M = list.size();
int N = readInt();
+ ensureWithinMemoryLimit(SIZE_COMPLEX_TYPE, N);
int i = 0;
for (; i < M && i < N; i++) {
list.set(i, readTypedObject(c));
@@ -4050,6 +4055,7 @@ public final class Parcel {
public final void readStringList(@NonNull List<String> list) {
int M = list.size();
int N = readInt();
+ ensureWithinMemoryLimit(SIZE_COMPLEX_TYPE, N);
int i = 0;
for (; i < M && i < N; i++) {
list.set(i, readString());
@@ -4071,6 +4077,7 @@ public final class Parcel {
public final void readBinderList(@NonNull List<IBinder> list) {
int M = list.size();
int N = readInt();
+ ensureWithinMemoryLimit(SIZE_COMPLEX_TYPE, N);
int i = 0;
for (; i < M && i < N; i++) {
list.set(i, readStrongBinder());
@@ -4093,6 +4100,7 @@ public final class Parcel {
@NonNull Function<IBinder, T> asInterface) {
int M = list.size();
int N = readInt();
+ ensureWithinMemoryLimit(SIZE_COMPLEX_TYPE, N);
int i = 0;
for (; i < M && i < N; i++) {
list.set(i, asInterface.apply(readStrongBinder()));
@@ -4159,6 +4167,7 @@ public final class Parcel {
list.clear();
return list;
}
+ ensureWithinMemoryLimit(SIZE_COMPLEX_TYPE, n);
final int m = list.size();
int i = 0;
@@ -5540,6 +5549,7 @@ public final class Parcel {
if (n < 0) {
return null;
}
+ ensureWithinMemoryLimit(SIZE_COMPLEX_TYPE, n);
HashMap<K, V> map = new HashMap<>(n);
readMapInternal(map, n, loader, clazzKey, clazzValue);
return map;
@@ -5555,6 +5565,8 @@ public final class Parcel {
private <K, V> void readMapInternal(@NonNull Map<? super K, ? super V> outVal, int n,
@Nullable ClassLoader loader, @Nullable Class<K> clazzKey,
@Nullable Class<V> clazzValue) {
+ ensureWithinMemoryLimit(SIZE_COMPLEX_TYPE, n);
+ // TODO: move all reservation of map size here, not all reserves?
while (n > 0) {
K key = readValue(loader, clazzKey);
V value = readValue(loader, clazzValue);
@@ -5580,6 +5592,7 @@ public final class Parcel {
*/
void readArrayMap(ArrayMap<? super String, Object> map, int size, boolean sorted,
boolean lazy, @Nullable ClassLoaderProvider loaderProvider, int[] lazyValueCount) {
+ ensureWithinMemoryLimit(SIZE_COMPLEX_TYPE, size);
while (size > 0) {
String key = readString();
Object value = (lazy) ? readLazyValue(loaderProvider) : readValue(
@@ -5625,6 +5638,7 @@ public final class Parcel {
if (size < 0) {
return null;
}
+ ensureWithinMemoryLimit(SIZE_COMPLEX_TYPE, size);
ArraySet<Object> result = new ArraySet<>(size);
for (int i = 0; i < size; i++) {
Object value = readValue(loader);
@@ -5646,6 +5660,8 @@ public final class Parcel {
*/
private <T> void readListInternal(@NonNull List<? super T> outVal, int n,
@Nullable ClassLoader loader, @Nullable Class<T> clazz) {
+ ensureWithinMemoryLimit(SIZE_COMPLEX_TYPE, n);
+ // TODO: move all size reservations here, instead of code that calls this. Not all reserves.
while (n > 0) {
T value = readValue(loader, clazz);
//Log.d(TAG, "Unmarshalling value=" + value);
@@ -5665,6 +5681,7 @@ public final class Parcel {
if (n < 0) {
return null;
}
+ ensureWithinMemoryLimit(SIZE_COMPLEX_TYPE, n);
ArrayList<T> l = new ArrayList<>(n);
readListInternal(l, n, loader, clazz);
return l;
@@ -5707,6 +5724,7 @@ public final class Parcel {
*/
private void readSparseArrayInternal(@NonNull SparseArray outVal, int N,
@Nullable ClassLoader loader) {
+ ensureWithinMemoryLimit(SIZE_COMPLEX_TYPE, N);
while (N > 0) {
int key = readInt();
Object value = readValue(loader);
@@ -5725,6 +5743,7 @@ public final class Parcel {
if (n < 0) {
return null;
}
+ ensureWithinMemoryLimit(SIZE_COMPLEX_TYPE, n);
SparseArray<T> outVal = new SparseArray<>(n);
while (n > 0) {