diff options
author | Amith Yamasani <yamasani@google.com> | 2013-09-18 18:01:20 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2013-09-18 18:01:21 +0000 |
commit | 840b3bd61185456ccb574c2be115ea78ec418327 (patch) | |
tree | 88d50fd9f81444f24bb0a298a7cb8c74f5f79747 /core/java/android | |
parent | 807fd0443564850bc69f229a282cbba990e1b656 (diff) | |
parent | 487c11a3101c6cd9fc18758b3032383666f55e46 (diff) | |
download | frameworks_base-840b3bd61185456ccb574c2be115ea78ec418327.zip frameworks_base-840b3bd61185456ccb574c2be115ea78ec418327.tar.gz frameworks_base-840b3bd61185456ccb574c2be115ea78ec418327.tar.bz2 |
Merge "Fix provider leak in PFD" into klp-dev
Diffstat (limited to 'core/java/android')
-rw-r--r-- | core/java/android/content/ContentResolver.java | 3 | ||||
-rw-r--r-- | core/java/android/os/ParcelFileDescriptor.java | 55 |
2 files changed, 37 insertions, 21 deletions
diff --git a/core/java/android/content/ContentResolver.java b/core/java/android/content/ContentResolver.java index f250029..5618cab 100644 --- a/core/java/android/content/ContentResolver.java +++ b/core/java/android/content/ContentResolver.java @@ -2316,8 +2316,7 @@ public abstract class ContentResolver { } @Override - public void close() throws IOException { - super.close(); + public void releaseResources() { if (!mProviderReleased) { ContentResolver.this.releaseProvider(mContentProvider); mProviderReleased = true; diff --git a/core/java/android/os/ParcelFileDescriptor.java b/core/java/android/os/ParcelFileDescriptor.java index 579971d..5a49b98 100644 --- a/core/java/android/os/ParcelFileDescriptor.java +++ b/core/java/android/os/ParcelFileDescriptor.java @@ -564,7 +564,11 @@ public class ParcelFileDescriptor implements Parcelable, Closeable { @Override public void close() throws IOException { if (mWrapped != null) { - mWrapped.close(); + try { + mWrapped.close(); + } finally { + releaseResources(); + } } else { closeWithStatus(Status.OK, null); } @@ -579,7 +583,11 @@ public class ParcelFileDescriptor implements Parcelable, Closeable { */ public void closeWithError(String msg) throws IOException { if (mWrapped != null) { - mWrapped.closeWithError(msg); + try { + mWrapped.closeWithError(msg); + } finally { + releaseResources(); + } } else { if (msg == null) { throw new IllegalArgumentException("Message must not be null"); @@ -588,17 +596,22 @@ public class ParcelFileDescriptor implements Parcelable, Closeable { } } - private void closeWithStatus(int status, String msg) throws IOException { - if (mWrapped != null) { - mWrapped.closeWithStatus(status, msg); - } else { - if (mClosed) return; - mClosed = true; - mGuard.close(); - // Status MUST be sent before closing actual descriptor - writeCommStatusAndClose(status, msg); - IoUtils.closeQuietly(mFd); - } + private void closeWithStatus(int status, String msg) { + if (mClosed) return; + mClosed = true; + mGuard.close(); + // Status MUST be sent before closing actual descriptor + writeCommStatusAndClose(status, msg); + IoUtils.closeQuietly(mFd); + releaseResources(); + } + + /** + * Called when the fd is being closed, for subclasses to release any other resources + * associated with it, such as acquired providers. + * @hide + */ + public void releaseResources() { } private byte[] getOrCreateStatusBuffer() { @@ -793,6 +806,9 @@ public class ParcelFileDescriptor implements Parcelable, Closeable { @Override protected void finalize() throws Throwable { + if (mWrapped != null) { + releaseResources(); + } if (mGuard != null) { mGuard.warnIfOpen(); } @@ -822,7 +838,11 @@ public class ParcelFileDescriptor implements Parcelable, Closeable { @Override public void writeToParcel(Parcel out, int flags) { if (mWrapped != null) { - mWrapped.writeToParcel(out, flags); + try { + mWrapped.writeToParcel(out, flags); + } finally { + releaseResources(); + } } else { out.writeFileDescriptor(mFd); if (mCommFd != null) { @@ -832,11 +852,8 @@ public class ParcelFileDescriptor implements Parcelable, Closeable { out.writeInt(0); } if ((flags & PARCELABLE_WRITE_RETURN_VALUE) != 0 && !mClosed) { - try { - // Not a real close, so emit no status - closeWithStatus(Status.SILENCE, null); - } catch (IOException e) { - } + // Not a real close, so emit no status + closeWithStatus(Status.SILENCE, null); } } } |