From 186683923ce8d6a2d5c6fd4768b26b90308661e9 Mon Sep 17 00:00:00 2001 From: Dianne Hackborn Date: Tue, 23 Mar 2010 22:10:55 -0700 Subject: [PATCH] Maybe fix #2422586: Native crash in android_os_Parcel_closeFileDescriptor() killed the phone process Try to make sure we never have a ParcelFileDescriptor with a null FileDescriptor. That is just wrong. Change-Id: Ib779ad1852dd239827797cd8f93505bfe6157e58 --- core/java/android/os/MemoryFile.java | 3 ++- core/java/android/os/ParcelFileDescriptor.java | 12 +++++++++--- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/core/java/android/os/MemoryFile.java b/core/java/android/os/MemoryFile.java index 9742b050d6e83..a81e16bacfb2d 100644 --- a/core/java/android/os/MemoryFile.java +++ b/core/java/android/os/MemoryFile.java @@ -273,7 +273,8 @@ public class MemoryFile * @hide */ public ParcelFileDescriptor getParcelFileDescriptor() throws IOException { - return new ParcelFileDescriptor(getFileDescriptor()); + FileDescriptor fd = getFileDescriptor(); + return fd != null ? new ParcelFileDescriptor(fd) : null; } /** diff --git a/core/java/android/os/ParcelFileDescriptor.java b/core/java/android/os/ParcelFileDescriptor.java index 3fcb18e4a5330..0a3b2cf77f83b 100644 --- a/core/java/android/os/ParcelFileDescriptor.java +++ b/core/java/android/os/ParcelFileDescriptor.java @@ -113,7 +113,7 @@ public class ParcelFileDescriptor implements Parcelable { } FileDescriptor fd = Parcel.openFileDescriptor(path, mode); - return new ParcelFileDescriptor(fd); + return fd != null ? new ParcelFileDescriptor(fd) : null; } /** @@ -127,7 +127,7 @@ public class ParcelFileDescriptor implements Parcelable { */ public static ParcelFileDescriptor fromSocket(Socket socket) { FileDescriptor fd = getFileDescriptorFromSocket(socket); - return new ParcelFileDescriptor(fd); + return fd != null ? new ParcelFileDescriptor(fd) : null; } // Extracts the file descriptor from the specified socket and returns it untouched @@ -163,7 +163,10 @@ public class ParcelFileDescriptor implements Parcelable { * If an error occurs attempting to close this ParcelFileDescriptor. */ public void close() throws IOException { - mClosed = true; + synchronized (this) { + if (mClosed) return; + mClosed = true; + } if (mParcelDescriptor != null) { // If this is a proxy to another file descriptor, just call through to its // close method. @@ -235,6 +238,9 @@ public class ParcelFileDescriptor implements Parcelable { /*package */ParcelFileDescriptor(FileDescriptor descriptor) { super(); + if (descriptor == null) { + throw new NullPointerException("descriptor must not be null"); + } mFileDescriptor = descriptor; mParcelDescriptor = null; }