From 9a1507aa10577badabcbe00396613a967302e456 Mon Sep 17 00:00:00 2001 From: Jeff Sharkey Date: Thu, 28 Aug 2014 20:38:10 -0700 Subject: FileBridge needs to keep strong reference to PFD. Even though we've grabbed the underlying FD, the PFD could be GC'ed and when finalized it would end up closing the underlying FD. This fix ties the PFD object lifecycle to the returned OutputStream. Bug: 17183379 Change-Id: Ibee8f4cf78fee357181a250d15f2a653294b2877 --- core/java/android/content/pm/PackageInstaller.java | 2 +- core/java/android/os/FileBridge.java | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/core/java/android/content/pm/PackageInstaller.java b/core/java/android/content/pm/PackageInstaller.java index c928a18c4be3..44e24b14e158 100644 --- a/core/java/android/content/pm/PackageInstaller.java +++ b/core/java/android/content/pm/PackageInstaller.java @@ -623,7 +623,7 @@ public class PackageInstaller { try { final ParcelFileDescriptor clientSocket = mSession.openWrite(name, offsetBytes, lengthBytes); - return new FileBridge.FileBridgeOutputStream(clientSocket.getFileDescriptor()); + return new FileBridge.FileBridgeOutputStream(clientSocket); } catch (RuntimeException e) { ExceptionUtils.maybeUnwrapIOException(e); throw e; diff --git a/core/java/android/os/FileBridge.java b/core/java/android/os/FileBridge.java index bf8d15c6209b..37842252a9ad 100644 --- a/core/java/android/os/FileBridge.java +++ b/core/java/android/os/FileBridge.java @@ -131,11 +131,13 @@ public class FileBridge extends Thread { } public static class FileBridgeOutputStream extends OutputStream { + private final ParcelFileDescriptor mClientPfd; private final FileDescriptor mClient; private final byte[] mTemp = new byte[MSG_LENGTH]; - public FileBridgeOutputStream(FileDescriptor client) { - mClient = client; + public FileBridgeOutputStream(ParcelFileDescriptor clientPfd) { + mClientPfd = clientPfd; + mClient = clientPfd.getFileDescriptor(); } @Override -- cgit v1.2.3-59-g8ed1b