MemoryIntArray: dup in writeToParcel.
Previously, if a MemoryIntArray is written to a parcel from multiple
threads, we'll create multiple ParcelFileDescriptors that own the same
file descriptor, which fdsan doesn't like. Instead of adopting and then
detaching, use ParcelFileDescriptor::fromFd which dups behind the scenes.
Bug: http://b/132720476
Test: treehugger
Change-Id: Iad4930cc2d8c59a9348fedb0889d24cb566afa62
diff --git a/core/java/android/util/MemoryIntArray.java b/core/java/android/util/MemoryIntArray.java
index 80b1607..7d287e3 100644
--- a/core/java/android/util/MemoryIntArray.java
+++ b/core/java/android/util/MemoryIntArray.java
@@ -175,12 +175,10 @@
@Override
public void writeToParcel(Parcel parcel, int flags) {
- ParcelFileDescriptor pfd = ParcelFileDescriptor.adoptFd(mFd);
- try {
- // Don't let writing to a parcel to close our fd - plz
- parcel.writeParcelable(pfd, flags & ~Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
- } finally {
- pfd.detachFd();
+ try (ParcelFileDescriptor pfd = ParcelFileDescriptor.fromFd(mFd)) {
+ parcel.writeParcelable(pfd, flags);
+ } catch (IOException ex) {
+ throw new RuntimeException(ex);
}
}