From 86cbc2bf30a7623b2ad6564cf50ca20f87067ea7 Mon Sep 17 00:00:00 2001 From: Dianne Hackborn Date: Tue, 28 Jul 2015 18:07:13 -0700 Subject: Work on issue #22765972: Binder transactions running out of address... ...space causing package manager to fail Lower the maximum IPC size we use in various places, to keep it under the threshold of becoming dangerous. Now everything tries to keep not much more than 64k. Change-Id: I814013097966a7843179e5d581bfdb254c5ae318 --- core/java/android/app/assist/AssistStructure.java | 4 ++-- core/java/android/content/pm/ParceledListSlice.java | 5 ++--- core/java/android/os/IBinder.java | 9 ++++++++- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/core/java/android/app/assist/AssistStructure.java b/core/java/android/app/assist/AssistStructure.java index ee0fc9110689..e08686c860fd 100644 --- a/core/java/android/app/assist/AssistStructure.java +++ b/core/java/android/app/assist/AssistStructure.java @@ -141,10 +141,10 @@ public class AssistStructure implements Parcelable { if (DEBUG_PARCEL) Log.d(TAG, "Creating PooledStringWriter @ " + out.dataPosition()); PooledStringWriter pwriter = new PooledStringWriter(out); while (writeNextEntryToParcel(as, out, pwriter)) { - // If the parcel contains more than 100K of data, then we are getting too + // If the parcel is above the IPC limit, then we are getting too // large for a single IPC so stop here and let the caller come back when it // is ready for more. - if (out.dataSize() > 1024*1024) { + if (out.dataSize() > IBinder.MAX_IPC_SIZE) { if (DEBUG_PARCEL) Log.d(TAG, "Assist data size is " + out.dataSize() + " @ pos " + out.dataPosition() + "; returning partial result"); out.writeInt(0); diff --git a/core/java/android/content/pm/ParceledListSlice.java b/core/java/android/content/pm/ParceledListSlice.java index e5c2203a2d20..cfb447334406 100644 --- a/core/java/android/content/pm/ParceledListSlice.java +++ b/core/java/android/content/pm/ParceledListSlice.java @@ -46,8 +46,7 @@ public class ParceledListSlice implements Parcelable { * TODO get this number from somewhere else. For now set it to a quarter of * the 1MB limit. */ - private static final int MAX_IPC_SIZE = 256 * 1024; - private static final int MAX_FIRST_IPC_SIZE = MAX_IPC_SIZE / 2; + private static final int MAX_IPC_SIZE = IBinder.MAX_IPC_SIZE; private final List mList; @@ -150,7 +149,7 @@ public class ParceledListSlice implements Parcelable { final Class listElementClass = mList.get(0).getClass(); dest.writeParcelableCreator(mList.get(0)); int i = 0; - while (i < N && dest.dataSize() < MAX_FIRST_IPC_SIZE) { + while (i < N && dest.dataSize() < MAX_IPC_SIZE) { dest.writeInt(1); final T parcelable = mList.get(i); diff --git a/core/java/android/os/IBinder.java b/core/java/android/os/IBinder.java index 73a0f658f5f0..2c21d135e2b8 100644 --- a/core/java/android/os/IBinder.java +++ b/core/java/android/os/IBinder.java @@ -149,7 +149,14 @@ public interface IBinder { * processes. */ int FLAG_ONEWAY = 0x00000001; - + + /** + * Limit that should be placed on IPC sizes to keep them safely under the + * transaction buffer limit. + * @hide + */ + public static final int MAX_IPC_SIZE = 64 * 1024; + /** * Get the canonical name of the interface supported by this binder. */ -- cgit v1.2.3-59-g8ed1b