Loading media/java/android/media/ExifInterface.java +15 −8 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ package android.media; import static android.media.ExifInterfaceUtils.byteArrayToHexString; import static android.media.ExifInterfaceUtils.closeFileDescriptor; import static android.media.ExifInterfaceUtils.closeQuietly; import static android.media.ExifInterfaceUtils.convertToLongArray; import static android.media.ExifInterfaceUtils.copy; Loading Loading @@ -1529,9 +1530,8 @@ 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; boolean isFdDuped = false; if (isSeekableFD(fileDescriptor)) { mSeekableFileDescriptor = fileDescriptor; // Keep the original file descriptor in order to save attributes when it's seekable. Loading @@ -1539,7 +1539,7 @@ public class ExifInterface { // feature won't be working. try { fileDescriptor = Os.dup(fileDescriptor); isFdOwner = true; isFdDuped = true; } catch (ErrnoException e) { throw e.rethrowAsIOException(); } Loading @@ -1549,10 +1549,13 @@ public class ExifInterface { mIsInputStream = false; FileInputStream in = null; try { in = new FileInputStream(fileDescriptor, isFdOwner); in = new FileInputStream(fileDescriptor); loadAttributes(in); } finally { closeQuietly(in); if (isFdDuped) { closeFileDescriptor(fileDescriptor); } } } Loading Loading @@ -2199,6 +2202,7 @@ public class ExifInterface { // Read the thumbnail. InputStream in = null; FileDescriptor newFileDescriptor = null; try { if (mAssetInputStream != null) { in = mAssetInputStream; Loading @@ -2211,9 +2215,9 @@ public class ExifInterface { } else if (mFilename != null) { in = new FileInputStream(mFilename); } else if (mSeekableFileDescriptor != null) { FileDescriptor fileDescriptor = Os.dup(mSeekableFileDescriptor); Os.lseek(fileDescriptor, 0, OsConstants.SEEK_SET); in = new FileInputStream(fileDescriptor, true); newFileDescriptor = Os.dup(mSeekableFileDescriptor); Os.lseek(newFileDescriptor, 0, OsConstants.SEEK_SET); in = new FileInputStream(newFileDescriptor); } if (in == null) { // Should not be reached this. Loading @@ -2234,6 +2238,9 @@ public class ExifInterface { Log.d(TAG, "Encountered exception while getting thumbnail", e); } finally { closeQuietly(in); if (newFileDescriptor != null) { closeFileDescriptor(newFileDescriptor); } } return null; } Loading media/java/android/media/ExifInterfaceUtils.java +18 −0 Original line number Diff line number Diff line Loading @@ -16,7 +16,12 @@ package android.media; import android.system.ErrnoException; import android.system.Os; import android.util.Log; import java.io.Closeable; import java.io.FileDescriptor; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; Loading @@ -25,6 +30,8 @@ import java.io.OutputStream; * Package private utility class for ExifInterface. */ class ExifInterfaceUtils { private static final String TAG = "ExifInterface"; /** * Copies all of the bytes from {@code in} to {@code out}. Neither stream is closed. * Returns the total number of bytes transferred. Loading Loading @@ -114,4 +121,15 @@ class ExifInterfaceUtils { } } } /** * Closes a file descriptor that has been duplicated. */ public static void closeFileDescriptor(FileDescriptor fd) { try { Os.close(fd); } catch (ErrnoException ex) { Log.e(TAG, "Error closing fd.", ex); } } } Loading
media/java/android/media/ExifInterface.java +15 −8 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ package android.media; import static android.media.ExifInterfaceUtils.byteArrayToHexString; import static android.media.ExifInterfaceUtils.closeFileDescriptor; import static android.media.ExifInterfaceUtils.closeQuietly; import static android.media.ExifInterfaceUtils.convertToLongArray; import static android.media.ExifInterfaceUtils.copy; Loading Loading @@ -1529,9 +1530,8 @@ 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; boolean isFdDuped = false; if (isSeekableFD(fileDescriptor)) { mSeekableFileDescriptor = fileDescriptor; // Keep the original file descriptor in order to save attributes when it's seekable. Loading @@ -1539,7 +1539,7 @@ public class ExifInterface { // feature won't be working. try { fileDescriptor = Os.dup(fileDescriptor); isFdOwner = true; isFdDuped = true; } catch (ErrnoException e) { throw e.rethrowAsIOException(); } Loading @@ -1549,10 +1549,13 @@ public class ExifInterface { mIsInputStream = false; FileInputStream in = null; try { in = new FileInputStream(fileDescriptor, isFdOwner); in = new FileInputStream(fileDescriptor); loadAttributes(in); } finally { closeQuietly(in); if (isFdDuped) { closeFileDescriptor(fileDescriptor); } } } Loading Loading @@ -2199,6 +2202,7 @@ public class ExifInterface { // Read the thumbnail. InputStream in = null; FileDescriptor newFileDescriptor = null; try { if (mAssetInputStream != null) { in = mAssetInputStream; Loading @@ -2211,9 +2215,9 @@ public class ExifInterface { } else if (mFilename != null) { in = new FileInputStream(mFilename); } else if (mSeekableFileDescriptor != null) { FileDescriptor fileDescriptor = Os.dup(mSeekableFileDescriptor); Os.lseek(fileDescriptor, 0, OsConstants.SEEK_SET); in = new FileInputStream(fileDescriptor, true); newFileDescriptor = Os.dup(mSeekableFileDescriptor); Os.lseek(newFileDescriptor, 0, OsConstants.SEEK_SET); in = new FileInputStream(newFileDescriptor); } if (in == null) { // Should not be reached this. Loading @@ -2234,6 +2238,9 @@ public class ExifInterface { Log.d(TAG, "Encountered exception while getting thumbnail", e); } finally { closeQuietly(in); if (newFileDescriptor != null) { closeFileDescriptor(newFileDescriptor); } } return null; } Loading
media/java/android/media/ExifInterfaceUtils.java +18 −0 Original line number Diff line number Diff line Loading @@ -16,7 +16,12 @@ package android.media; import android.system.ErrnoException; import android.system.Os; import android.util.Log; import java.io.Closeable; import java.io.FileDescriptor; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; Loading @@ -25,6 +30,8 @@ import java.io.OutputStream; * Package private utility class for ExifInterface. */ class ExifInterfaceUtils { private static final String TAG = "ExifInterface"; /** * Copies all of the bytes from {@code in} to {@code out}. Neither stream is closed. * Returns the total number of bytes transferred. Loading Loading @@ -114,4 +121,15 @@ class ExifInterfaceUtils { } } } /** * Closes a file descriptor that has been duplicated. */ public static void closeFileDescriptor(FileDescriptor fd) { try { Os.close(fd); } catch (ErrnoException ex) { Log.e(TAG, "Error closing fd.", ex); } } }