From 3f5ffa615a64a221d8d310beda6bad4fe1ac1e21 Mon Sep 17 00:00:00 2001 From: Jeongik Cha Date: Tue, 24 Nov 2020 22:44:42 +0900 Subject: [PATCH] ParcelableHolder shouldn't write anything for empty case If neither Parcel nor Parcelable exists, ParcelableHolder'd better write nothing like NDK and C++ backend. In the case of empty ParcelableHolder As-is(Java): 4 -> Size -1 -> Existence(empty string) To-be(NDK, C++ now): 0 -> Size Test: atest CtsNdkBinderTestCases Bug: 173682663 Change-Id: I816108fdc59170ea7408f0633295ba978f1ef9d5 --- core/java/android/os/ParcelableHolder.java | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/core/java/android/os/ParcelableHolder.java b/core/java/android/os/ParcelableHolder.java index 95c07b6b2451b..fb9fa109bfa30 100644 --- a/core/java/android/os/ParcelableHolder.java +++ b/core/java/android/os/ParcelableHolder.java @@ -170,16 +170,21 @@ public final class ParcelableHolder implements Parcelable { mParcelable = null; + int dataSize = parcel.readInt(); + if (dataSize < 0) { + throw new IllegalArgumentException("dataSize from parcel is negative"); + } else if (dataSize == 0) { + if (mParcel != null) { + mParcel.recycle(); + mParcel = null; + } + return; + } if (mParcel == null) { mParcel = Parcel.obtain(); } mParcel.setDataPosition(0); mParcel.setDataSize(0); - - int dataSize = parcel.readInt(); - if (dataSize < 0) { - throw new IllegalArgumentException("dataSize from parcel is negative"); - } int dataStartPos = parcel.dataPosition(); mParcel.appendFrom(parcel, dataStartPos, dataSize); @@ -196,6 +201,11 @@ public final class ParcelableHolder implements Parcelable { return; } + if (mParcelable == null) { + parcel.writeInt(0); + return; + } + int sizePos = parcel.dataPosition(); parcel.writeInt(0); int dataStartPos = parcel.dataPosition();