summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author John Reck <jreck@google.com> 2019-07-26 12:19:56 -0700
committer John Reck <jreck@google.com> 2019-07-26 23:19:05 +0000
commit12ea937f8f22987654f7a04f025570c29876962c (patch)
tree2f76960a76556ccb2ca7fbd7577716a00047e216
parent5818412305a0c2fbaa399874ca00d479dd20d135 (diff)
Fix regression in PFD#fromData
Don't rely on the GC to clean up FD resources when they can just be cleaned up immediately. We know the MemoryFile isn't going to be used any further, so just close it. Bug: 138323667 Test: Repro steps in bug. Verified addresses FD leak in system_server from repeatedly opening & closing settings. Change-Id: Ic82006c9cb48f580aaad942c4679e774186382c9
-rw-r--r--core/java/android/os/ParcelFileDescriptor.java14
1 files changed, 9 insertions, 5 deletions
diff --git a/core/java/android/os/ParcelFileDescriptor.java b/core/java/android/os/ParcelFileDescriptor.java
index 8355e08b6aa8..2a4576adf192 100644
--- a/core/java/android/os/ParcelFileDescriptor.java
+++ b/core/java/android/os/ParcelFileDescriptor.java
@@ -581,12 +581,16 @@ public class ParcelFileDescriptor implements Parcelable, Closeable {
public static ParcelFileDescriptor fromData(byte[] data, String name) throws IOException {
if (data == null) return null;
MemoryFile file = new MemoryFile(name, data.length);
- if (data.length > 0) {
- file.writeBytes(data, 0, 0, data.length);
+ try {
+ if (data.length > 0) {
+ file.writeBytes(data, 0, 0, data.length);
+ }
+ file.deactivate();
+ FileDescriptor fd = file.getFileDescriptor();
+ return fd != null ? ParcelFileDescriptor.dup(fd) : null;
+ } finally {
+ file.close();
}
- file.deactivate();
- FileDescriptor fd = file.getFileDescriptor();
- return fd != null ? ParcelFileDescriptor.dup(fd) : null;
}
/**