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
This commit is contained in:
Josh Gao
2019-05-15 13:35:59 -07:00
parent 28706f020b
commit 536cf5e016

View File

@@ -175,12 +175,10 @@ public final class MemoryIntArray implements Parcelable, Closeable {
@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);
}
}