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:
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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.
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user