From 8a2a706e1744c26f4f5a17a3e66ead8fc8d9f1c2 Mon Sep 17 00:00:00 2001 From: Jin Seok Park Date: Wed, 22 May 2019 17:09:38 +0900 Subject: [PATCH] Prevent file descriptor leak Bug: 133251455 Test: atest CtsMediaTestCases:android.media.cts.ExifInterfaceTest; Change-Id: I9f27e1dd44908921f1a46d8bcdd8ad8090158d18 --- media/java/android/media/ExifInterface.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/media/java/android/media/ExifInterface.java b/media/java/android/media/ExifInterface.java index d83cd96994666..58c6be9be4c71 100644 --- a/media/java/android/media/ExifInterface.java +++ b/media/java/android/media/ExifInterface.java @@ -1395,6 +1395,9 @@ public class ExifInterface { } mAssetInputStream = null; mFilename = null; + // When FileDescriptor is duplicated and set to FileInputStream, ownership needs to be + // clarified in order for garbage collection to take place. + boolean isFdOwner = false; if (isSeekableFD(fileDescriptor)) { mSeekableFileDescriptor = fileDescriptor; // Keep the original file descriptor in order to save attributes when it's seekable. @@ -1402,6 +1405,7 @@ public class ExifInterface { // feature won't be working. try { fileDescriptor = Os.dup(fileDescriptor); + isFdOwner = true; } catch (ErrnoException e) { throw e.rethrowAsIOException(); } @@ -1411,7 +1415,7 @@ public class ExifInterface { mIsInputStream = false; FileInputStream in = null; try { - in = new FileInputStream(fileDescriptor); + in = new FileInputStream(fileDescriptor, isFdOwner); loadAttributes(in); } finally { IoUtils.closeQuietly(in); @@ -1966,7 +1970,7 @@ public class ExifInterface { } else if (mSeekableFileDescriptor != null) { FileDescriptor fileDescriptor = Os.dup(mSeekableFileDescriptor); Os.lseek(fileDescriptor, 0, OsConstants.SEEK_SET); - in = new FileInputStream(fileDescriptor); + in = new FileInputStream(fileDescriptor, true); } if (in == null) { // Should not be reached this.