From b3e4ef37021a9e5518fdbc7d0cbb0a1709d5301b Mon Sep 17 00:00:00 2001 From: Dan Egnor Date: Tue, 20 Jul 2010 09:03:35 -0700 Subject: COMMENT ONLY change to add some warnings about ParcelFileDescriptor behavior with Parcel.writeValue(). Change-Id: If55fcce29559379855735ff5297cf4f46d5d6be6 Bug: 2847738 --- core/java/android/os/Parcel.java | 19 ++++++++++++++++--- core/java/android/os/ParcelFileDescriptor.java | 5 +++++ 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/core/java/android/os/Parcel.java b/core/java/android/os/Parcel.java index 8ad600c644f3..bb6357e55b19 100644 --- a/core/java/android/os/Parcel.java +++ b/core/java/android/os/Parcel.java @@ -437,6 +437,12 @@ public final class Parcel { /** * Write a FileDescriptor into the parcel at the current dataPosition(), * growing dataCapacity() if needed. + * + *

The file descriptor will not be closed, which may + * result in file descriptor leaks when objects are returned from Binder + * calls. Use {@link ParcelFileDescriptor#writeToParcel} instead, which + * accepts contextual flags and will close the original file descriptor + * if {@link Parcelable#PARCELABLE_WRITE_RETURN_VALUE} is set.

*/ public final native void writeFileDescriptor(FileDescriptor val); @@ -1000,7 +1006,7 @@ public final class Parcel { /** * Flatten a generic object in to a parcel. The given Object value may * currently be one of the following types: - * + * * + * + *

{@link Parcelable} objects are written with + * {@link Parcelable#writeToParcel} using contextual flags of 0. When + * serializing objects containing {@link ParcelFileDescriptor}s, + * this may result in file descriptor leaks when they are returned from + * Binder calls (where {@link Parcelable#PARCELABLE_WRITE_RETURN_VALUE} + * should be used).

*/ public final void writeValue(Object v) { if (v == null) { @@ -1120,7 +1133,7 @@ public final class Parcel { /** * Flatten the name of the class of the Parcelable and its contents * into the parcel. - * + * * @param p The Parcelable object to be written. * @param parcelableFlags Contextual flags as per * {@link Parcelable#writeToParcel(Parcel, int) Parcelable.writeToParcel()}. diff --git a/core/java/android/os/ParcelFileDescriptor.java b/core/java/android/os/ParcelFileDescriptor.java index 0a3b2cf77f83..e8fe302e28d3 100644 --- a/core/java/android/os/ParcelFileDescriptor.java +++ b/core/java/android/os/ParcelFileDescriptor.java @@ -250,6 +250,11 @@ public class ParcelFileDescriptor implements Parcelable { return Parcelable.CONTENTS_FILE_DESCRIPTOR; } + /** + * {@inheritDoc} + * If {@link Parcelable#PARCELABLE_WRITE_RETURN_VALUE} is set in flags, + * the file descriptor will be closed after a copy is written to the Parcel. + */ public void writeToParcel(Parcel out, int flags) { out.writeFileDescriptor(mFileDescriptor); if ((flags&PARCELABLE_WRITE_RETURN_VALUE) != 0 && !mClosed) { -- cgit v1.2.3-59-g8ed1b