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
This commit is contained in:
Dianne Hackborn
2015-07-28 18:07:13 -07:00
parent 3551a59b27
commit 86cbc2bf30
3 changed files with 12 additions and 6 deletions

View File

@@ -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);

View File

@@ -46,8 +46,7 @@ public class ParceledListSlice<T extends Parcelable> 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<T> mList;
@@ -150,7 +149,7 @@ public class ParceledListSlice<T extends Parcelable> 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);

View File

@@ -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.
*/